微信公众号支付接口文档
V2.7
公众号支付接口文档V2.7
微信公众号支付接口文档
V2.7
版本说明
版本更改说明更新时间
V2.6
更新实例代码成实际可运行
2014-04-29
V2.7
更新订单号重复说明
2014-06-18
微信公众号支付接口文档
V2.7
1.
微信支付简介
................................................................................................................................4
1.1
功能简介
.............................................................................................................................4
1.2
支付账户
.............................................................................................................................4
1.3
支付方式
.............................................................................................................................5
1.3.1
网页内支付场景
---JSAPI
(网页内)支付接口
...................................................5
1.3.2
线下扫码购买场景
---Native
(原生)支付接口
....................................................7
(网页内)支付接口
.........................................................................................................8
2.1
支付场景
.............................................................................................................................8
2.2
功能交互
.............................................................................................................................9
2.3
获取当前微信版本号
.......................................................................................................10
2.4
显示微信安全支付标题
...................................................................................................10
2.5JSAPI
支付接口(
getBrandWCPayRequest
)定义
........................................................10
2.6
订单详情(
package
)扩展字符串定义
..........................................................................11
2.7
支付签名(
paySign
)生成方法
......................................................................................14
2.8
接口使用示例
...................................................................................................................16
(原生)支付接口
...........................................................................................................17
3.1
支付场景
...........................................................................................................................17
3.2
基本交互
...........................................................................................................................18
3.3Native
(原生)支付接口描述
..........................................................................................19
3.4Native
(原生)支付
URL
定义
........................................................................................19
3.5Native
(原生)支付
URL
签名方式
................................................................................20
3.6Native
(原生)支付回调商户后台获取
package............................................................21
微信公众号支付接口文档
V2.7
4.
通知接口说明
..............................................................................................................................22
4.1
通知接口简介
...................................................................................................................22
4.2
补单机制
...........................................................................................................................23
4.3
通知接口参数
...................................................................................................................23
4.4
后台通知结果返回
...........................................................................................................25
接口说明
..............................................................................................................................26
5.1API
接口简介
.....................................................................................................................26
5.2API
使用方式
.....................................................................................................................26
5.3API
列表
.............................................................................................................................26
5.3.1
获取
access_token..................................................................................................26
5.3.2
发货通知
delivernotify..........................................................................................27
5.3.3
订单查询
orderquery............................................................................................29
5.3.3
告警通知
................................................................................................................32
6.
常见问题和注意事项
................................................................................................................33
6.1
帮助
SDK..........................................................................................................................33
6.2
常见基本概念疑惑
...........................................................................................................33
6.3
常见错误现象及解决方法
...............................................................................................34
6.4
常见注意事项
...................................................................................................................35
6.5
最新接口文档下载
...........................................................................................................36
6.6
联系我们
...........................................................................................................................36
微信公众号支付接口文档
V2.7
1.微信支付简介
1.1功能简介
微信支付,是基于微信客户端提供的支付服务功能。同时向商户提供销售经营分析、账
户和资金管理的功能支持。用户通过扫描二维码、微信内打开商品页面购买等多种方式调起
微信支付模块完成支付。
微信支持公众号内支付,即基于公众号向用户收款,公众号相当于收款的商户。其中支
付方式,可以分为JSAPI(网页内)支付、Native(原生)支付。商户可以结合业务场景,
自主选择支付方式。
本文将全面介绍公众号支付的技术方案。
1.2支付账户
商户向微信公众平台提交企业以及银行账户资料,商户功能审核通过后,可以获得以下
帐户(包含财付通的商户账户),用于公众号支付。
帐号作用
appId
公众号身份的唯一标识。前三项审核通过后,在微信发送的邮件中查看。
paySignKey
公众号支付请求中用于加密的密钥
Key
,可验证商户唯一身份,
PaySignKey
对应于支付场景中的
appKey
值。前三项审核通过后,在微信发送的邮件中
查看。
appSecret
除了支付请求需要用到
paySignKey
,公众平台接口
API
的权限获取所需密
钥
Key
,在使用所有公众平台
API
时,都需要先用它去换取
access_token
,
然后再进行调用(详情参考文档
API
接口部分)。前三项审核通过后,在微
微信公众号支付接口文档
V2.7
信发送的邮件中查看。
partnerId
财付通商户身份的标识。前三项审核通过后,在财付通发送的邮件中查看。
partnerKey
财付通商户权限密钥Key。前三项审核通过后,在财付通发送的邮件中查看。
注意:appSecret、paySignKey、partnerKey是验证商户唯一性的安全标识,请妥善保管。
对于appSecret和paySignKey的区别,可以这样认为:appSecret是API使用时的登录密码,
会在网络中传播的;而paySignKey是在所有支付相关数据传输时用于加密并进行身份校验
的密钥,仅保留在第三方后台和微信后台,不会在网络中传播,而且paySignKey仅用于支
付请求。
1.3支付方式
公众号支付有
2
种方式:
JSAPI
(网页内网页内)
)
支付:是指用户打开图文消息或者扫描二维码,在微信内置浏览器打
开网页进行的支付。商户网页前端通过使用微信提供的
JSAPI
,调用微信支付模块。这种方
式,适合需要在商户网页进行选购下单的购买流程。
Native(原生)支付:是指商户组成符合Native(原生)支付规则的URL链接,用户
可通过在会话中点击链接或者扫描对应的二维码直接进入微信支付模块(客户端界面),即
可进行支付。这种方式,适合无需选购直接支付的购买流程。
以上两种支付方式,最大的差别在于是否需要经过网页调起支付。以下是两种支付方式
的基本交互。
1.3.1网页内支付场景---JSAPI(网页内)支付接口
商户已有H5商城网站,在微信内打开网页时,可以调用微信支付完成下单购买的流程。
微信公众号支付接口文档
V2.7
步骤(1):左图,商户下发图文消息或者通过自定义菜单吸引用户点击进入商户网页。
步骤(2):右图,进入家网页,用户选择购买,完成选购流程。
步骤(3):左图,调起微信支付控件,用户开始输入支付密码。
步骤(4):右图,密码验证通过,支付成功。商户后台得到支付成功的通知。
步骤(5):左图,返回商户页面,显示购买成功。该页面由商户自定义。
步骤(6):右图,公众号下发消息,提示发货成功。该步骤可选。
微信公众号支付接口文档
V2.7
注意:商户也可以把商品网页的链接生成二维码,用户扫一扫打开后即可完成购买支付。
1.3.2线下扫码购买场景---Native(原生)支付接口
与网页内支付场景不同,部分商户不需要经过网页选购,可以直接下单购买。
步骤(1):左图,商户根据微信支付的规则,为不同商品生成不同的二维码,张贴在
各种场景,便于用户扫描购买。
步骤(2):右图,用户使用微信扫描二维码后,获取商品信息,同时到商户后台下单。
步骤(3):左图,用户开始支付,输入支付密码。
微信公众号支付接口文档
V2.7
步骤(4):右图,支付成功,商户后台得到通知,进行发货处理。
2.
JSAPI(网页内)
(网页内)支付接口
支付接口
2.1支付场景
以下是支付场景的交互细节,请认真阅读,并设计商户页面的逻辑:
(1)用户打开商户网页选购商品,发起支付,在网页通过JavaScript调用
getBrandWCPayRequest接口,发起微信支付请求,用户进入支付流程。
(2)用户成功支付点击完成按钮后,商户的前端会收到JavaScript的返回值。商户可
直接跳转到支付成功的静态页面进行展示。
(3)商户后台收到来自微信开放平台的支付成功回调通知,标志该笔订单支付成功。
注:
(2)和(3)的触发不保证遵循严格的时序。JSAPI返回值作为触发商户网页跳转的标
志,但商户后台应该只在收到微信后台的支付成功回调通知后只在收到微信后台的支付成功回调通知后,
,
才做真正的支付成功的处理。
JSAPI返回值目前只在支付成功时返回,后续版本将扩展返回值,以便商户做更多个
微信公众号支付接口文档
V2.7
性化的展示。
2.2功能交互
JSAPI的交互时序图:
微信公众号支付接口文档
V2.7
2.3获取当前微信版本号
由于微信5.0版本后才加入微信支付模块,低版本用户调用微信支付功能将无效。因此,
建议商户通过uragent来确定用户当前的版本号后再调用支付接口。以iPhone版本为例,
可以通过
uragent
可获取如下微信版本示例信息:
"Mozilla/5.0(iphone;CPUiphoneOS5_1_1likeMacOSX)AppleWebKit/534.46(KHTML,like
Geocko)Mobile/9B206MicroMesnger/5.0"
其中5.0为用户安装的微信版本号,商户可以判定版本号是否高于或者等于5.0。
2.4显示微信安全支付标题
对于商户具有支付权限且需要调用微信支付的页面,为了让用户增加购买信心,确认交
易环境安全,微信强烈建议商户使用微信强烈建议商户使用“
“
微信安全支付微信安全支付”
”
标题。安全支付标题的如下图。
显示支付安全标题,需将原始链接添加上
"showwxpaytitle=1"
的尾串。通过这种方式,
商户的页面将出现微信安全支付的标识。例如,原始
URL
为:
htp://,
显示安全
支付标题的
URL
为:
htp://?showwxpaytitle=1
。
当用户在微信里打开
不会直接出现微信安全支付的标题,而打开
htp://?showwxpaytitle=1
后将出现微信安全支付标题。
2.5JSAPI支付接口(getBrandWCPayRequest)定义
微信JSAPI只能在微信内置浏览器中使用,其他浏览器调用无效。微信提供
getBrandWCPayRequest接口供商户前端网页调用,调用之前微信会鉴定商户支付权限,若
商户具有调起支付的权限,则将开始支付流程。这里主要介绍支付前的接口调用规则,支付
微信公众号支付接口文档
V2.7
状态消息通知机制请参加下文。
接口需要注意:所有传入参数都是字符串类型!
getBrandWCPayRequest
参数以及返回值定义
参数列表
参数名称必填格式说明
appId
公众号id是字符串类型
商户注册具有支付权限的公众号成功后即可
获得;
timeStamp
时间戳是
字符串类型,
32
个字节以下
商户生成,从
1970
年
1
月
1
日
00
:
00
:
00
至
今的秒数,即当前的时间,且最终需要转换为
字符串形式;
nonceStr
随机字符串是
字符串类型,32
个字节以下
商户生成的随机字符串;
package
订单详情扩展
字符串
是
字符串类型,
4096个字节以下
商户将订单信息组成该字符串,具体组成方案
参见接口使用说明中package组包帮助;由商
户按照规范拼接后传入;
signType
签名方式是
字符串类型,参
数取值
"SHA1"
按照文档中所示填入,目前仅支持
SHA1
;
paySign
签名是字符串类型
商户将接口列表中的参数按照指定方式进行
签名,签名方式使用
signType
中标示的签名方
式,具体签名方案参见接口使用说明中签名帮
助;由商户按照规范签名后传入;
返回结果
返回值说明
err_msg
get_brand_wcpay_request:ok支付成功
get_brand_wcpay_request:cancel支付过程中用户取消
get_brand_wcpay_request:fail
支付失败
注:JSAPI的返回结果get_brand_wcpay_request:ok仅在用户成功完成支付时返回。由
于前端交互复杂,get_brand_wcpay_request:cancel或者get_brand_wcpay_request:fail可以统
一处理为用户遇到错误或者主动放弃,不必细化区分。
2.6订单详情(package)扩展字符串定义
在商户调起
JSAPI
时,商户需要此时确定该笔订单详情,并将该订单详情通过一定的
微信公众号支付接口文档
V2.7
方式进行组合放入
package
。
JSAPI
调用后,微信将通过
package
的内容生成预支付单。下
面将定义
package
的所需字段列表以及签名方法。
接口需要注意:所有传入参数都是字符串类型!
package
所需字段列表
参数名称必填格式说明
bank_type
银行通道类型是
字符串类型,
固定为
"WX",注意
大写
固定为"WX";
body
商品描述是
字符串类型,
128
字节以
下
商品描述;
attach
附加数据否
字符串类型,
128字节以
下
附加数据,原样返回;
partner
商户号是字符串类型注册时分配的财付通商户号partnerId;
out_trade_no
商户订单号是
字符串类型,
32
字节以下
商户系统内部的订单号,
32
个字符内、可包含字
母;确保在商户系统唯一,详见注意事项,第
5
项
total_fee
订单总金额是字符串类型订单总金额,单位为分;
fee_type
支付币种是
字符串类型,
默认值是"1"
取值:1(人民币),暂只支持1;
notify_url
通知
URL
是
字符串类型,
255
字节以
下
在支付完成后,接收微信通知支付结果的
URL
,
需给绝对路径,
255
字符内
,
格式
如
:/
;
spbill_create_ip
订单生成的机
器IP
是
字符串类型,
15字节以下
指用户浏览器端IP,不是商户服务器IP,格式为
IPV4;
time_start
交易起始时间否
字符串类型,
14字节以下
订单生成时间,格式为yyyyMMddHHmmss,如
2009年12月25日9点10分10秒表示为
20,时区为GMT+8beijing;该时
间取自商户服务器;
time_expire
交易结束时间否
字符串类型,
14
字节以下
订单失效时间,格式为
yyyyMMddHHmmss
,如
2009
年
12
月
27
日
9
点
10
分
10
秒表示为
20
,时区为
GMT+8beijing
;该时
间取自商户服务器;
transport_fee
物流费用否字符串类型
物流费用,单位为分。如果有值,必须保证
transport_fee+product_fee=total_fee;
product_fee
商品费用否字符串类型
商品费用,单位为分。如果有值,必须保证
transport_fee+product_fee=total_fee;
微信公众号支付接口文档
V2.7
goods_tag
商品标记否字符串类型商品标记,优惠券时可能用到;
input_chart
传入参数字符
编码
是字符串类型取值范围:"GBK"、"UTF-8",默认:"GBK"
package
生成方法
由于
package
中携带了生成订单的详细信息,因此在微信将对
package
里面的内容进行鉴
权,确定
package
携带的信息是真实、有效、合理的。因此,这里将定义生成
package
字符
串的方法。
a.
对所有传入参数按照字段名的
ASCII
码从小到大排序(字典序)后,使用
URL
键值
对的格式(即
key1=value1&key2=value2
…)拼接成字符串
string1
,注意:值为空的参数不
参与签名;
b.
在
string1
最后拼接上
key=paternerKey
得到
stringSignTemp
字符串,并对
stringSignTemp
进行
md5
运算,再将得到的字符串所有字符转换为大写,得到
sign
值
signValue
。
c.
对传入参数中所有键值对的
value
进行
urlencode
转码后重新拼接成字符串
string2
。
对于
JS
前端程序,一定要使用函数
encodeURIComponent
进行
urlencode
编码(注意注意!
!
进行
urlencode
时要将空格转化为
%20
而不是
+
)。
d.
将
sign=signValue
拼接到
string2
后面
得到最终的
package
字符串。
下面定义了一段生成
package
字符串的示范过程:
假设以下为
package
传入参数:
bank_type=WX
body=支付测试
fee_type=1
input_chart=UTF-8
notify_url=
out_trade_no=7240b65810859cbf2a8d9f76a638c0a3
partner=1900000109
spbill_create_ip=196.168.1.1
微信公众号支付接口文档
V2.7
total_fee=1
i
:经过
a
过程
URL
键值对字典序排序后的字符串
string1
为:
bank_type=WX&body=
支付测试
&fee_type=1&input_chart=UTF-8¬ify_url=http://we
&out_trade_no=7240b65810859cbf2a8d9f76a638c0a3&partner=1900000109&spbill_
create_ip=196.168.1.1&total_fee=1
ii
:经过
b
过程后得到
sign
为:
sign
=md5(string1&key=8934e7d15453e97507ef794cf7b0519d).toUpperCa
=md5(bank_type=WX&body=
支付测试
&fee_type=1&input_chart=UTF-8¬ify_url=htt
p://&out_trade_no=7240b65810859cbf2a8d9f76a638c0a3&partner=1900000109&
spbill_create_ip=196.168.1.1&total_fee=1&key=8934e7d15453e97507ef794cf7b0519d).toUpper
Ca()
="7f77b507b755b3262884291517e380f8".toUpperCa()
="7F77B507B755B3262884291517E380F8"
iii
:再对传入参数中的每一个键值对中的
value
进行
urlencode
编码后得到:
bank_type=WX&body=%E6%94%AF%E4%BB%98%E6%B5%8B%E8%AF%95&fee_typ
e=1&input_chart=UTF-8¬ify_url=http%3A%2F%&out_trade_no=7240b6
5810859cbf2a8d9f76a638c0a3&partner=1900000109&spbill_create_ip=196.168.1.1&total_fee=1
iv
:拼接上
sign
后得到最终
package
结果:
bank_type=WX&body=%E6%94%AF%E4%BB%98%E6%B5%8B%E8%AF%95&fee_typ
e=1&input_chart=UTF-8¬ify_url=http%3A%2F%&out_trade_no=7240b6
5810859cbf2a8d9f76a638c0a3&partner=1900000109&spbill_create_ip=196.168.1.1&total_fee=1
&sign=7F77B507B755B3262884291517E380F8
2.7支付签名(paySign)生成方法
paySign
字段是对本次发起
JSAPI
的行为进行鉴权,只有通过了
paySign
鉴权,才能继
续对
package
鉴权并生成预支付单。这里将定义
paySign
的生成规则。
参与
paySign
签名的字段包括:
appid
、
timestamp
、
noncestr
、
package
以及
appkey
(即
paySignkey
)。这里
signType
并不参与签名。
a.
对所有待签名参数按照字段名的
ASCII
码从小到大排序(字典序)后,使用
URL
键
值对的格式(即
key1=value1&key2=value2
…)拼接成字符串
string1
。这里需要注意的是所
微信公众号支付接口文档
V2.7
有参数名均为小写字符,例如
appId
在排序后字符串则为
appid
;
b.
对
string1
作签名算法,字段名和字段值都采用原始值(此时
package
的
value
就对应
了使用
2.6
中描述的方式生成的
package
),不进行
URL
转义。具体签名算法为
paySign=
SHA1(string)
。
这里给出生成
paySign
的具体示例如下:
假设参数如下:
appid=wxd930ea5d5a258f4f
appkey=L8LrMqqeGRxST5reouB0K66CaYAWpqhAVsq7ggKkxHCOastWksvuX1uvmvQcl
xaHoYd3ElNBrNO2DHnnzgfVG9Qs473M3DTOZug5er46FhuGofumV8H2FVR9qkjSlC5K
noncestr=e7d161ac8d8a76529d39d9f5b4249ccb
package=bank_type=WX&body=%E6%94%AF%E4%BB%98%E6%B5%8B%E8%AF%95
&fee_type=1&input_chart=UTF-8¬ify_url=http%3A%2F%&out_trade_no
=7240b65810859cbf2a8d9f76a638c0a3&partner=1900000109&spbill_create_ip=196.168.1.1&tot
al_fee=1&sign=7F77B507B755B3262884291517E380F8
timestamp=1399514976
traceid=test_1399514976
i
:经过
a
过程键值对排序后得到
string1
为:
appid=wxd930ea5d5a258f4f&appkey=L8LrMqqeGRxST5reouB0K66CaYAWpqhAVsq7gg
KkxHCOastWksvuX1uvmvQclxaHoYd3ElNBrNO2DHnnzgfVG9Qs473M3DTOZug5er46FhuGo
fumV8H2FVR9qkjSlC5K&noncestr=e7d161ac8d8a76529d39d9f5b4249ccb&package=bank_type
=WX&body=%E6%94%AF%E4%BB%98%E6%B5%8B%E8%AF%95&fee_type=1&input_cha
rt=UTF-8¬ify_url=http%3A%2F%&out_trade_no=7240b65810859cbf2a8
d9f76a638c0a3&partner=1900000109&spbill_create_ip=196.168.1.1&total_fee=1&sign=7F77B5
07B755B3262884291517E380F8×tamp=1399514976&traceid=test_1399514976
ii
:经过
b
过程签名后可得到:
paySign=SHA1(appid=wxd930ea5d5a258f4f&appkey=L8LrMqqeGRxST5reouB0K66CaYA
WpqhAVsq7ggKkxHCOastWksvuX1uvmvQclxaHoYd3ElNBrNO2DHnnzgfVG9Qs473M3DTO
Zug5er46FhuGofumV8H2FVR9qkjSlC5K&noncestr=e7d161ac8d8a76529d39d9f5b4249ccb&pa
ckage=bank_type=WX&body=%E6%94%AF%E4%BB%98%E6%B5%8B%E8%AF%95&fee_t
ype=1&input_chart=UTF-8¬ify_url=http%3A%2F%&out_trade_no=7240
b65810859cbf2a8d9f76a638c0a3&partner=1900000109&spbill_create_ip=196.168.1.1&total_fee
=1&sign=7F77B507B755B3262884291517E380F8×tamp=1399514976&traceid=test_1399
514976)
=8893870b9004ead28691b60db97a8d2c80dbfdc6
注意:以上操作可通过沙箱测试验证签名的有效性,沙箱地址:
微信公众号支付接口文档
V2.7
/debug/cgi-bin/readtmpl?t=pay/index
2.8接口使用示例
接口需要注意:所有传入参数都是字符串类型!使用JavaScript、PHP等弱类型语言需
要关注一下。
示例代码如下:
//传入公众号名称,时间戳,随机串,Package扩展字段,签名方式和PaySign签名
('getBrandWCPayRequest',{
"appId":"wxd930ea5d5a258f4f",
"timeStamp":"1399514976",
"nonceStr":"e7d161ac8d8a76529d39d9f5b4249ccb",
"package":
"bank_type=WX&body=%E6%94%AF%E4%BB%98%E6%B5%8B%E8%AF%95&fee_ty
pe=1&input_chart=UTF-8¬ify_url=http%3A%2F%&out_trade_no=7240b
65810859cbf2a8d9f76a638c0a3&partner=1900000109&spbill_create_ip=196.168.1.1&total_fee=
1&sign=7F77B507B755B3262884291517E380F8",
"signType":"SHA1",
"paySign":"8893870b9004ead28691b60db97a8d2c80dbfdc6"
},function(res){
//返回_msg,取值
//get_brand_wcpay_request:cancel用户取消
//get_brand_wcpay_request:fail发送失败
//get_brand_wcpay_request:ok发送成功
(_msg);
alert(_code+_desc);
});
微信公众号支付接口文档
V2.7
(原生)支付接口
3.1支付场景
(1)商户想使用Native(原生)支付方式,除了填写申请支付的资料,还需要提供一个获
取订单package的回调URL(该URL在公众平台后台登记),以便微信后台通过POST的
方式去获取该笔支付的订单信息。
(2)商户根据微信指定的规则生成原生支付的URL字符串,当用户点击该字符串,或者通
过扫描该字符串对应的二维码时,微信后台开始进入预支付流程。
(3)微信后台鉴定权限后,通过POST方式向商户后台获取生成订单的必要信息,再次鉴
定获取的信息成功后,客户端将进入支付流程。
(4)支付成功后,微信后台将通过POST机制通知商户后台该笔交易已成功。
微信公众号支付接口文档
V2.7
3.2基本交互
Native的交互时序图:
微信公众号支付接口文档
V2.7
3.3Native(原生)支付接口描述
Native(原生)支付过程中,首先需要商户定义符合Native(原生)支付规范的URL,
也就是Native(原生)支付URL,同时在微信后台POST商户后台时需要提供package内容。
因此这里将重点介绍支付前的接口调用,支付通知等信息请查看下文。
3.4Native(原生)支付URL定义
Native(原生)支付URL是一系列具有weixin://wxpay/bizpayurl?前缀的URL,同时后
面紧跟着一系列辨别商户的键值对。Native(原生)支付URL的规则如下:
weixin://wxpay/bizpayurl?sign=XXXXX&appid=XXXXXX&productid=XXXXXX&ti
mestamp=XXXXXX&noncestr=XXXXXX
其中XXXXX为商户需要填写的内容,具体参数定义如下:
参数名称必填格式说明
appid
公众号
id
;是字符串类型
商户注册具有支付权限的公众号成功后即
可获得;
微信公众号支付接口文档
V2.7
timestamp
时间戳是
字符串类型,32
字符以下
商户生成从1970年1月1日00:00:00至
今的秒数,即当前的时间,且最终需要转换
为字符串形式:
noncestr
随机字符串是
字符串类型,32
字符以下
商户生成的随机字符串;
productid
商品唯一
id
是
字符串类型,
32
字符以下
商户需要定义并维护自己的商品
id
,这个
id
与一张订单等价,微信后台凭借该
id
通过
POST
商户后台获取交易必须信息;
sign
签名是字符串类型
对前面的其他字段与
appKey
按照字典序排
序后,使用
SHA1
算法得到的结果。由商户
生成后传入;
3.5Native(原生)支付URL签名方式
参与sign签名的字段包括:appid、timestamp、noncestr、productid以及appkey。
签名步骤和规则请参看
2.7
节说明。
这里给出生成
sign
的具体示例如下:
假设参数如下:
"appid":"wxf8b4f85f3a794e77",
"timestamp":"189026618",
"noncestr":"adssdasssd13d",
"productid":"123456",
"appkey":"2Wozy2aksie1puXUBpWD8oZxiD1DfQuEaiC7KcRATv1Ino3mdopKaPGQQ7Tt
kNySuAmCaDCrw4xhPY5qKTBl7Fzm0RgR3c0WaVYIXZARsxzHV2x7iwPPzOz94dnwPWSn"
则经过a过程后得到:
string1=
"appid=wxf8b4f85f3a794e77&appkey=2Wozy2aksie1puXUBpWD8oZxiD1DfQuEaiC7KcR
ATv1Ino3mdopKaPGQQ7TtkNySuAmCaDCrw4xhPY5qKTBl7Fzm0RgR3c0WaVYIXZARsxzH
V2x7iwPPzOz94dnwPWSn&noncestr=adssdasssd13d&productid=123456×tamp=18902661
8"
则经过SHA1处理后得到:
sign=18c6122878f0e946ae294e016eddda9468de80df
微信公众号支付接口文档
V2.7
3.6Native(原生)支付回调商户后台获取package
在公众平台接到用户点击上述特殊Native(原生)支付的URL之后,会调用注册时填
写的商户获取订单Package的回调URL。
假设回调
URL
为
/cgi-bin/bizpaygetpackage
微信公众平台调用时会使用
POST
方式,推送
xml
格式的
PostData
,形如:
参数说明:
(1)OpenId,点击链接准备购买商品的用户标识
(2)AppId,公众帐号的appid
(3)IsSubscribe,标记用户是否订阅该公众帐号,1为关注,0为未关注
(4)ProductId,第三方的商品ID号
(5)TimeStamp,时间戳
(6)NonceStr,随机串
(7)AppSignature,参数的加密签名,是根据2.7支付签名生成方法中所讲的签名方式
生成的签名
(8)SignMethod,签名方式,目前只支持“SHA1”,该字段不参与签名
第三方为了确保是来自于微信公众平台的合法请求,需要使用同样的方式生成签名,并
与AppSignature的值进行对比。
微信公众号支付接口文档
V2.7
参与签名的字段为:
appid
、
appkey
、
productid
、
timestamp
、
noncestr
、
openid
、
issubscribe
。
为了返回
Package
数据,回调
URL
必须返回一个
xml
格式的返回数据,形如:
A9%B5%A5%D6%A7%B8%B6%A3%AC%B2%FA%C6%B7ID%A3%BA000000&fee_type=1
&input_chart=GBK¬ify_url=http%3A%2F%%2Fpub%2Fnotify%2
&out_trade_no=1400179182&partner=1217752501&product_fee=1&spbill_create_ip
=101.226.103.62&total_fee=1&transport_fee=0&sign=E1CF503DDC51E1CE6681BDC80FCD6
449]]>
其中,
AppSignature
依然是根据前文
2.7
节所讲的签名方式生成的签名,参与签名的字
段为:
appid
、
appkey
、
package
、
timestamp
、
noncestr
、
retcode
、
reterrmsg
。
package
的生成规则请参考
2.6
节所定义的
package
生成规则。这里就不再赘述了。
其中,对于一些第三方觉得商品已经过期或者其他错误的情况,可以在
RetCode
和
RetErrMsg中体现出来,RetCode为0表明正确,可以定义其他错误;当定义其他错误时,
可以在RetErrMsg中填上UTF8编码的错误提示信息,比如“该商品已经下架”,客户端会
直接提示出来。
4.通知接口说明
4.1通知接口简介
用户在成功完成支付后,微信后台通知(POST)商户服务器(notify_url)支付结果。
商户可以使用notify_url的通知结果进行个性化页面的展示。
微信公众号支付接口文档
V2.7
4.2补单机制
对后台通知交互时,如果微信收到商户的应答不是success或超时,微信认为通知失败,
微信会通过一定的策略(如30分钟共8次)定期重新发起通知,尽可能提高通知的成功率,
但微信不保证通知最终能成功。
由于存在重新发送后台通知的情况,因此同样的通知可能会多次发送给商户系统。
商户
系统必须能够正确处理重复的通知。
微信推荐的做法是,当收到通知进行处理时,首先检查对应业务数据的状态,判断该通
知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回success。在对业务
数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混
乱。
目前补单机制的间隔时间为:
8s
、
10s
、
10s
、
30s
、
30s
、
60s
、
120s
、
360s
、
1000s
。
4.3通知接口参数
后台通知通过请求中的
notify_url
进行,采用
POST
机制。返回通知中的参数一致,
URL
包含如下内容:
字段名变量名必填类型说明
协议参数
签名方式
sign_type
否
String(8)
签名类型,取值:
MD5
、
RSA
,默
认:
MD5
字符集
input_chart
否
String(8)
字符编码,取值:GBK、UTF-8,默
认:GBK。
签名
sign
是
String(32)
签名
业务参数
交易模式
trade_mode
是
Int
1-
即时到账
其他保留
交易状态
trade_state
是
Int
支付结果:
0—成功
其他保留
微信公众号支付接口文档
V2.7
商户号
partner
是
String(10)
商户号,也即之前步骤的partnerid,
由微信统一分配的10位正整数
(120XXXXXXX)号
付款银行
bank_type
是
String(16)
银行类型,在微信中使用
WX
银行订单号
bank_billno
否
String(32)
银行订单号
总金额
total_fee
是
Int
支付金额,单位为分,如果discount
有值,通知的total_fee+discount=
请求的total_fee
币种
fee_type
是
Int
现金支付币种,目前只支持人民币,
默认值是1-人民币
通知
ID
notify_id
是
String(128)
支付结果通知
id
,对于某些特定商
户,只返回通知
id
,要求商户据此
查询交易结果
订单号
transaction_id
是
String(28)
交易号,
28
位长的数值,其中前
10
位为商户号,之后
8
位为订单产生
的日期,如
20090415
,最后
10
位
是流水号。
商户订单号
out_trade_no
是
String(32)
商户系统的订单号,与请求一致。
商户数据包
attach
否
String(127)
商户数据包,原样返回,空参数不
传递
支付完成时间
time_end
是
String(14)
支付完成时间,格式为
yyyyMMddhhmmss
,如
2009
年
12
月
27
日
9
点
10
分
10
秒表示为
20
。时区为
GMT+8
beijing
。
物流费用
transport_fee
否
Int
物流费用,单位分,默认
0
。如果
有值,必须保证
transport_fee+
product_fee=total_fee
物品费用
product_fee
否
Int
物品费用,单位分。如果有值,必
须保证transport_fee+
product_fee=total_fee
折扣价格
discount
否
Int
折扣价格,单位分,如果有值,通
知的total_fee+discount=请求的
total_fee
接收参数后需要验证这些参数的签名,签名方式与2.6节步骤和方式相同。同时,在
postData中还将包含xml数据。数据如下:
微信公众号支付接口文档
V2.7
各字段定义如下:
参数必填说明
AppId
是
字段名称:公众号
id
;字段来源:商户注册具有支付权限的公众号成
功后即可获得;传入方式:由商户直接传入。
TimeStamp
是
字段名称:时间戳;字段来源:商户生成从
1970
年
1
月
1
日
00
:
00
:
00至今的秒数,即当前的时间;由商户生成后传入。取值范围:32
字符以下
NonceStr
是
字段名称:随机字符串;字段来源:商户生成的随机字符串;取值范
围:长度为32个字符以下。由商户生成后传入。取值范围:32字符
以下
OpenId
是
支付该笔订单的用户
ID
,商户可通过公众号其他接口为付款用户服
务。
AppSignature
是
字段名称:签名;字段来源:对前面的其他字段与appKey按照字典
序排序后,使用SHA1算法得到的结果。由商户生成后传入。
IsSubscribe
是用户是否关注了公众号。1为关注,0为未关注。
AppSignature依然是根据2.7节支付签名(paySign)签名方式生成,参与签名的字段为:
appid、appkey、timestamp、noncestr、openid、issubscribe。
从以上信息可以看出,URL参数中携带订单相关信息,postData中携带该次支付的用
户相关信息,这将便于商户拿到openid,以便后续提供更好的售后服务。
4.4后台通知结果返回
微信后台通过
notify_url
通知商户,商户做业务处理后,需要以字符串的形式反馈处理
结果
,内容如下:
微信公众号支付接口文档
V2.7
返回结果结果说明
success
处理成功,微信系统收到此结果后不再进行后续通知
fail
或其它字符处理不成功,微信收到此结果或者没有收到任何结果,系统通过补单机制再次通知
接口说明
5.1API接口简介
为了更好地接入支付的整个流程,包括购买、通知、发货等,微信提供了一系列的支付
相关API,以供第三方调用。
5.2API使用方式
在使用
API
之前,需要拥有
API
使用过程中用到的具有时效性的凭证
access_token
。
这个获取方式就是使用前文提到的
appid
和
appcret
调用
token
这个
api
获取。更详细的文
档请参考:
/wiki/?title=%E8%8E%B7%E5%8F%96access_token
说
明文档中的通用接口。
只有拥有了有效
access_token
(即相当于具有了一定时间内的
API
登录态),后续的所
有
API
调用才会成功。
5.3API列表
5.3.1获取access_token
access_token
对应于公众号是全局唯一的票据,每天有获取次数限制,所有
API
公用,
正常情况下
access_token
有效期为
7200
秒,重复获取将导致上次获取的
access_token
失效。
微信公众号支付接口文档
V2.7
它的获取方式为:
http
请求方式
:GET
地址:
/cgi-bin/token?grant_type=client_credential&appid=APPID&cret
=APPSECRET
请求参数含义:
grant_type
:获取
access_token
,此处填写
client_credential
appid
:第三方用户唯一凭证
cret
:第三方用户唯一凭证密钥,既
appcret
返回结果说明:
正确的
Json
返回示例
:
{"access_token":"ACCESS_TOKEN","expires_in":7200}
返回参数说明:
access_token
:获取到的凭证(最大长度为
512
字节)
expires_in
:凭证有效时间,单位:秒。正常情况下
access_token
有效期为
7200
秒,重
复获取将导致上次获取的
access_token
失效。
错误的
Json
返回示例
:
{"errcode":40013,"errmsg":"invalidappid"}
5.3.2发货通知delivernotify
为了更好地跟踪订单的情况,需要第三方在收到最终支付通知之后,调用发货通知API
告知微信后台该订单的发货状态。
发货时间限制:虚拟、服务类24小时内,实物类72小时内。
微信公众号支付接口文档
V2.7
请在收到支付通知后,按时发货,并使用发货通知接口将相关信息同步到微信后台请在收到支付通知后,按时发货,并使用发货通知接口将相关信息同步到微信后台。
。
若
平台在规定时间内没有收到,将视作发货超时处理。
API
的
URL
为:
/pay/delivernotify?access_token=xxxxxx
URL
中的参数只包含目前微信公众平台凭证
access_token
,而发货通知的真正的数据是
放在
PostData
中的,格式为
json
,如下:
{
"appid":"wwwwb4f85f3a797777",
"openid":"oX99MDgNcgwnz3zFN3DNmo8uwa-w",
"transid":"3333",
"out_trade_no":"555666uuu",
"deliver_timestamp":"1369745073",
"deliver_status":"1",
"deliver_msg":"ok",
"app_signature":"53cca9d47b883bd4a5c85a9300df3da0cb48565c",
"sign_method":"sha1"
}
其中,
appid
是公众平台账户的
AppId
;
openid
是购买用户的
OpenId
,这个已经放在最终支付结果通知的
PostData
里了;
transid是交易单号;
out_trade_no是第三方订单号;
deliver_timestamp是发货时间戳,这里指的是Linux时间戳;
deliver_status是发货状态,1表明成功,0表明失败,失败时需要在deliver_msg填上失
败原因;
deliver_msg是发货状态信息,失败时可以填上UTF8编码的错误提示信息,比如“该
商品已退款”;
app_signature依然是根据支付签名(paySign)生成方法中所讲的签名方式生成的,参
加签名字段为:
appid
、
appkey
、
openid
、
transid
、
out_trade_no
、
deliver_timestamp
、
deliver_status
、
微信公众号支付接口文档
V2.7
deliver_msg
;
sign_method
是签名方法(不计入签名生成);
微信公众平台在校验
ok
之后,会返回数据表明是否通知成功,例如:
{"errcode":0,"errmsg":"ok"}
如果有异常,会在
errcode
和
errmsg
描述出来,如果成功
errcode
就为
0
。
5.3.3
订单查询
orderquery
因为某一方技术的原因,可能导致商户在预期时间内都收不到最终支付通知,此时商户
可以通过该API来查询订单的详细支付状态。
API的URL为:/pay/orderquery?access_token=xxxxxx
URL中的参数只包含目前微信公众平台凭证access_token,而订单查询的真正数据是放
在PostData中的,格式为json,如下:
{
"appid":"wwwwb4f85f3a797777",
"package":"out_trade_no=11122&partner=1900090055&sign=4e8d0df3da0c3d0df38f",
"timestamp":"1369745073",
"app_signature":"53cca9d47b883bd4a5c85a9300df3da0cb48565c",
"sign_method":"sha1"
}
其中,
appid
是公众平台账户的
AppId
;
package
是查询订单的关键信息数据,包含第三方唯一订单号
out_trade_no
、财付通商户
身份标识
partner
(即前文所述的
partnerid
)、签名
sign
,其中
sign
是对参数字典序排序并
使用
&
联合起来,最后加上
&key=partnerkey
(唯一分配),进行
md5
运算,再转成全大写,
最终得到
sign
,对于示例,就是:
sign=md5
(
out_trade_no=11122&partner=1900090055&key=xxxxxx
)
.toupper
;
微信公众号支付接口文档
V2.7
timestamp
是
linux
时间戳;
app_signature
依然是根据支付签名(
paySign
)生成方法中所讲的签名方式生成的,参
加签名字段为:
appid
、
appkey
、
package
、
timestamp
;
sign_method
是签名方法(不计入签名生成);
微信公众平台在校验
ok
之后,会返回数据表明是否通知成功,例如:
{"errcode":0,"errmsg":"ok",......}
如果有异常,会在
errcode
和
errmsg
描述出来,如果成功
errcode
就为
0
。
如果查询成功,会返回详细的订单数据,如下:
{
"errcode":0,
"errmsg":"ok",
"order_info":
{
"ret_code":0,
"ret_msg":"",
"input_chart":"GBK",
"trade_state":"0",
"trade_mode":"1",
"partner":"1900000109",
"bank_type":"CMB_FP",
"bank_billno":"2",
"total_fee":"1",
"fee_type":"1",
"transaction_id":"1941",
"out_trade_no":"298687258",
"is_split":"fal",
"is_refund":"fal",
"attach":"",
"time_end":"23",
"transport_fee":"0",
"product_fee":"1",
"discount":"0",
"rmb_total_fee":""
}
}
对于详细的订单信息,放在
order_info
中的
json
数据中,各个字段的含义如下:
微信公众号支付接口文档
V2.7
ret_code
是查询结果状态码,
0
表明成功,其他表明错误;
ret_msg
是查询结果出错信息;
input_chart
是返回信息中的编码方式;
trade_state
是订单状态,
0
为成功,其他为失败;
trade_mode
是交易模式,
1
为即时到帐,其他保留;
partner
是财付通商户号,即前文的
partnerid
;
bank_type
是银行类型;
bank_billno
是银行订单号;
total_fee
是总金额,单位为分;
fee_type
是币种,
1
为人民币;
transaction_id
是财付通订单号;
out_trade_no
是第三方订单号;
is_split
表明是否分账,
fal
为无分账,
true
为有分账;
is_refund
表明是否退款,
fal
为无退款,
ture
为退款;
attach
是商户数据包,即生成订单
package
时商户填入的
attach
;
time_end
是支付完成时间;
transport_fee
是物流费用,单位为分;
product_fee
是物品费用,单位为分;
discount
是折扣价格,单位为分;
rmb_total_fee
是换算成人民币之后的总金额,单位为分,一般看
total_fee
即可。
微信公众号支付接口文档
V2.7
5.3.3
告警通知
为了及时通知商户异常,提高商户在微信平台的服务质量。微信后台会向商户推送告警
通知,包括发货延迟、调用失败、通知失败等情况,通知的地址是商户在申请支付时填写的
告警通知
URL
,在“公众平台
-
服务
-
服务中心
-
商户功能
-
商户基本资料
-
告警通知
URL
”可
以查看。
商户接收到告警通知后请尽快修复其中提到的问题,以免影响线上经营
商户接收到告警通知后请尽快修复其中提到的问题,以免影响线上经营。
。
(发货时
间要求请参考5.3.1)
商户收到告警通知后商户收到告警通知后,
,
需要成功返回success。在通过功能发布检测时在通过功能发布检测时,
,
请保证已调通请保证已调通。
。
告警通知URL接收的postData中还将含xml数据,格式如下:
签名字段签名字段:
:
alarmcontent、appid、appkey、description、errortype、timestamp。签名
方式与
2.7
节步骤和方式相同
e>
错误描述
ErrorTypeDescriptionAlarmContent
1001
发货超时
transaction_id=XXXXX
微信公众号支付接口文档
V2.7
6.常见问题和注意事项
6.1帮助SDK
为了帮助商户更好地完成支付功能的开发,我们提供了生成支付请求的辅助SDK,里
面封装了相关的参数签名算法,可供商户参考。下载地址为:
/cgi-bin/readtemplate?t=business/faq_tmpl&lang=zh_CN
6.2常见基本概念疑惑
(1)还没拿到正式号,如何调试测试?
答:只有在“商户功能”审核通过以后,收到了微信和财付通的相关邮件,才可以进行
开发。
(2)支付授权目录如何使用?
答:支付授权目录是支付功能正式上线后,商户后台发起支付请求的页面所在的目录。
这个目录在注册填写时,需要精确到最细一级的目录,且在使用时,目录名称后直接加
文件名,不可再增加or删减目录。
举例:发起请求的页面url为/weixin/pay/?XXXXX,则
填写的目录应该为/weixin/pay/;反之,若填写的目录为
/weixin/pay/,则发起请求的页面url只能在目录后增加文件名,不
可增减、修改任何目录。
(3)支付测试目录和支付授权目录?
答:支付授权目录将会在产品上线审核时,以及上线后长期使用的正式目录。支付测试
目录是提供给开发者,在开发测试期间使用的临时目录。这两个目录都是发起支付请求
微信公众号支付接口文档
V2.7
的页面文件所在的位置。
6.3常见错误现象及解决方法
(
1
)点击支付按钮,调用
JSAPI
没反应?
答:尝试发起支付的页面
url
,不在支付授权目录下,请检查
url
与支付授权目录是否对
应。
(
2
)点击支付按钮,提示点击支付按钮,提示“
“
access_not_allowaccess_not_allow”
”
答:参与测试人员的微信号没有在白名单中,将测试用户加入白名单。操作在
“
——功能——商户功能——支付测试”。
(
3
)点击支付按钮,提示点击支付按钮,提示“
“
access_denied
”
答:尝试发起支付的页面
url
,不在支付授权目录下,请检查
url
与支付授权目录是否对
应。
(
4
)点击支付页面链接后,没有反应?
答:在开发调试阶段,测试链接需要在公众号内点击打开。操作方法可以是:白名单用
户在公众号内向公众号发一条消息,消息内容即为测试链接,然后点击打开。
(
5
)点击支付按钮,提示点击支付按钮,提示“
“
当前公众号没有权限支付本次交易当前公众号没有权限支付本次交易”
”
答:请确认使用的
APPID
是否正确,确认在
MP
平台前三项审核结果均为“审核通过”。
(
6
)点击支付按钮,提示点击支付按钮,提示“
“
众账号支付使用了无效的商户号,无法发起该笔交易众账号支付使用了无效的商户号,无法发起该笔交易”
”
答:请检查是否使用了正确的商户号,确认
MP
平台前三项审核结果均为“审核通过”。
(
7
)点击支付按钮,提示点击支付按钮,提示“
“
支付请求参数错误,请核实再试支付请求参数错误,请核实再试”
”
or
“交易出错,请稍后
再试再试”
”
微信公众号支付接口文档
V2.7
答:请检查
package
参数是否为空,并注意格式,检查签名是否有误。可参考
6.1
中提到
的帮助
SDK
。
(
8
)点击支付按钮,提示点击支付按钮,提示“
“
该公众号支付签名无效,无法发起该笔交易该公众号支付签名无效,无法发起该笔交易”
”
答:调起支付的
SHA1
签名错误,请检查相关签名。可参考
6.1
中提到的帮助
SDK
。
(
9
)点击支付按钮,大多数情况正常,只是很偶尔情况提示签名错误
答:有可能某些运营商会直接修改请求中的
IP
,最保险的办法是“商户服务器向
H5
页
面传
package
时,将
ip
写成整数或其他非
ip
形式,
H5
接到后,再换成正规的
ip
地址“(注
意,只有在传输的时候需要改,其余时候均使用标准正规
ip
格式)
(
10
)获取
token
过程中,提示
过程中,提示“
“
outoffreq
”
答:获取
token
频率超限。
Token
有效期为
7200
秒,不需要、也不要每次支付都重新获
取一次,建议进行保存,即将过期时或已经过期时,再重新获取。
(
11
)用户成功支付,点击
“
完成
”
,又再次跳转至输入密码页面,仍可支付并二次扣费
答:用户在商户的
H5
页面点击了两次“微信支付”,生成了两笔订单,需要在
H5
页面
微信支付按钮上增加防二次点击的机制。
(
12
)
Notifyurl
无法接收通知
答:不支持非
80
端口,同时注意不要被防火墙拦截。
(
13
)
Notifyurl
通知收到的参数缺少
PostData
部分
答:可尝试使用此方法接收:
file_get_contents()
6.4常见注意事项
(1)参数大小写问题
请留意文档中要求的字符大小写问题,如“md5运算后,字符串的字符要转换为大写”,
微信公众号支付接口文档
V2.7
“
bank_type
填写时,
WX
大写”,“参与签名的字符串要小写”等。
(
2
)参数格式问题
所有传入参数,均为字符串类型,请注意文档中各处的具体要求。
(
3
)签名问题
建议使用“帮助
SDK
”生成签名;时间戳
timeStamp
和随即字符串
nonceStr
,在调用
JS
API
和参与
paySign
签名时要保持一致。请不要使用文档中的参数值进行签名调试(数
值均已失效)。
(
4
)时间戳问题
请使用
Linux
时间戳,注意为字符串格式。精确到秒,不需要到毫秒,即10位数字。
(
5
)同一商户订单号支付问题
商户的
outtradeno
必须全局唯一,调试和生产环境,都需要使用唯一的订单号。注意:
当商户的同一个商户号绑定了公众号支付、小额刷卡、
APP
支付也需要加标识来区分,
不能出现重复。当发起支付返回失败时,一定要用原订单的
outtradeno
而不能重新生
成新的订单号发起支付,避免同一单重复支付。
6.5联系我们
如果您在开发中遇到问题,可以进入到我们的论坛(网址:
/qa/?qa=questions),上面有用户成功解决的方案,更高效解
决您的问题。如果未找到解决方案,可以在上面提问,我们会第一时间回复。
获取最新文档和支付体验,请关注公众号:WXPayService”微信支付商户助手”。
本文发布于:2023-03-03 14:37:10,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/1677825430124162.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:微信修改支付密码.doc
本文 PDF 下载地址:微信修改支付密码.pdf
留言与评论(共有 0 条评论) |