关键字:微信支付、动态native支付、扫码支付、扫码支付模式2、统一支付php
用户扫描商户展现在各类场景的二维码进行支付。算法
步骤1:商户根据微信支付的规则,为不一样商品生成不一样的二维码(如图1.1),展现在各类场景,用于用户扫描购买。api
步骤2:用户使用微信“扫一扫”(如图1.2)扫描二维码后,获取商品支付信息,引导用户完成支付(如图1.3)。安全
图1.1支付二维码 图1.2打开微信扫一扫 图1.3 支付确认页面服务器
步骤(3):用户确认支付,输入支付密码(如图1.4)。微信
步骤(4):支付完成后会提示用户支付成功(如图1.5),商户后台获得支付成功的通知,而后进行发货处理。网络
图1.4用户确认支付,输入密码 图1.5 支付成功提示app
发送和接收参数格式均为XML格式。异步
第一步,设全部发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。微信支付
特别注意如下重要规则:
◆ 参数名ASCII码从小到大排序(字典序);
◆ 若是参数的值为空不参与签名;
◆ 参数名区分大小写;
◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值做校验。
◆ 微信接口可能增长字段,验证签名时必须支持增长的扩展字段
第二步,在stringA最后拼接上key获得stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将获得的字符串全部字符转换为大写,获得sign值signValue。
key设置路径:微信商户平台(pay.weixin.qq.com)-->帐户设置-->API安全-->密钥设置
商户后台系统调用微信支付【统一下单API】生成预付交易,将接口返回的连接生成二维码,用户扫码后输入密码完成支付交易。
用户支付后,微信将支付结果通知到【统一下单API】中配置的notify_url连接地址,商户后台系统拿到支付结果后作相应的订单状态变动。
商户后台可根据订单号或者微信订单号,调用【订单查询API】查询订单支付状态。
注意:该模式的预付单有效期为2小时,过时后没法支付。
https://api.mch.weixin.qq.com/pay/unifiedorder
否
注:如下只列出了关键参数
字段名 |
变量名 |
必填 |
类型 |
示例值 |
描述 |
公众帐号ID |
appid |
是 |
String(32) |
wxd678efh567hg6787 |
微信支付分配的公众帐号ID(企业号corpid即为此appId) |
商户号 |
mch_id |
是 |
String(32) |
1230000109 |
微信支付分配的商户号 |
随机字符串 |
nonce_str |
是 |
String(32) |
5K8264ILTKCH16CQ2502SI8ZNMTM67VS |
随机字符串,长度要求在32位之内。推荐随机数生成算法 |
签名 |
sign |
是 |
String(32) |
C380BEC2BFD727A4B6845133519F3AD6 |
经过签名算法计算得出的签名值,详见签名生成算法 |
签名类型 |
sign_type |
否 |
String(32) |
HMAC-SHA256 |
签名类型,默认为MD5,支持HMAC-SHA256和MD5。 |
商品描述 |
body |
是 |
String(128) |
腾讯充值中心-QQ会员充值 |
商品简单描述,该字段请按照规范传递,具体请见参数规定 |
商户订单号 |
out_trade_no |
是 |
String(32) |
20150806125346 |
商户系统内部订单号,要求32个字符内、且在同一个商户号下惟一 |
标价金额 |
total_fee |
是 |
Int |
88 |
订单总金额,单位为分 |
终端IP |
spbill_create_ip |
是 |
String(16) |
123.12.12.123 |
APP和网页支付提交用户端ip,Native支付填调用微信支付API的机器IP。 |
通知地址 |
notify_url |
是 |
String(256) |
http://www.weixin.qq.com/wxpay/pay.php |
异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。 |
交易类型 |
trade_type |
是 |
String(16) |
NATIVE |
取值以下:JSAPI,NATIVE,APP等 |
商品ID |
product_id |
否 |
String(32) |
12235413214070356458058 |
trade_type=NATIVE时(即扫码支付),此参数必传。此参数为二维码中包含的商品ID,商户自行定义。 |
.... |
字段名 |
变量名 |
必填 |
类型 |
示例值 |
描述 |
返回状态码 |
return_code |
是 |
String(16) |
SUCCESS |
SUCCESS/FAIL此字段是通讯标识,非交易标识,交易是否成功须要查看result_code来判断 |
返回信息 |
return_msg |
否 |
String(128) |
签名失败 |
返回信息,如非空,为错误缘由 签名失败 参数格式校验错误 |
如下字段在return_code为SUCCESS的时候有返回
字段名 |
变量名 |
必填 |
类型 |
示例值 |
描述 |
公众帐号ID |
appid |
是 |
String(32) |
wx8888888888888888 |
调用接口提交的公众帐号ID |
商户号 |
mch_id |
是 |
String(32) |
1900000109 |
调用接口提交的商户号 |
设备号 |
device_info |
否 |
String(32) |
013467007045764 |
自定义参数,能够为请求支付的终端设备号等 |
随机字符串 |
nonce_str |
是 |
String(32) |
5K8264ILTKCH16CQ2502SI8ZNMTM67VS |
微信返回的随机字符串 |
签名 |
sign |
是 |
String(32) |
C380BEC2BFD727A4B6845133519F3AD6 |
微信返回的签名值,详见签名算法 |
业务结果 |
result_code |
是 |
String(16) |
SUCCESS |
SUCCESS/FAIL |
错误代码 |
err_code |
否 |
String(32) |
SYSTEMERROR |
|
错误代码描述 |
err_code_des |
否 |
String(128) |
系统错误 |
错误信息描述 |
如下字段在return_code 和result_code都为SUCCESS的时候有返回
字段名 |
变量名 |
必填 |
类型 |
示例值 |
描述 |
交易类型 |
trade_type |
是 |
String(16) |
JSAPI |
交易类型,取值为:JSAPI,NATIVE,APP等 |
预支付交易会话标识 |
prepay_id |
是 |
String(64) |
wx201410272009395522657a690389285100 |
|
二维码连接 |
code_url |
否 |
String(64) |
weixin://wxpay/s/An4baqw |
trade_type为NATIVE时有返回,用于生成二维码,展现给用户进行扫码支付 |
支付完成后,微信会把相关支付结果和用户信息发送给商户,商户须要接收处理,并返回应答。
对后台通知交互时,若是微信收到商户的应答不是成功或超时,微信认为通知失败,微信会经过必定的策略按期从新发起通知,尽量提升通知的成功率,但微信不保证通知最终能成功。(通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒)
注意:
一样的通知可能会屡次发送给商户系统。商户系统必须可以正确处理重复的通知。
特别提醒:商户系统对于支付结果通知的内容必定要作签名验证,并校验返回的订单金额是否与商户侧的订单金额一致,防止数据泄漏致使出现“假通知”,形成资金损失。
【统一下单API】中提交的参数notify_url,若是连接没法访问,商户将没法接收到微信通知。
注意:
通知url必须为直接可访问的url,不能携带参数。示例:notify_url:“https://pay.weixin.qq.com/wxpay/pay.action”。
否
字段名 |
变量名 |
必填 |
类型 |
示例值 |
描述 |
返回状态码 |
return_code |
是 |
String(16) |
SUCCESS |
SUCCESS/FAIL此字段是通讯标识,非交易标识,交易是否成功须要查看result_code来判断 |
返回信息 |
return_msg |
否 |
String(128) |
签名失败 |
返回信息,如非空,为错误缘由 签名失败 参数格式校验错误 |
如下字段在return_code为SUCCESS的时候有返回
注:如下只列出了关键参数
字段名 |
变量名 |
必填 |
类型 |
示例值 |
描述 |
公众帐号ID |
appid |
是 |
String(32) |
wxd678efh567hg6787 |
微信支付分配的公众帐号ID(企业号corpid即为此appId) |
商户号 |
mch_id |
是 |
String(32) |
1230000109 |
微信支付分配的商户号 |
随机字符串 |
nonce_str |
是 |
String(32) |
5K8264ILTKCH16CQ2502SI8ZNMTM67VS |
随机字符串,长度要求在32位之内。推荐随机数生成算法 |
签名 |
sign |
是 |
String(32) |
C380BEC2BFD727A4B6845133519F3AD6 |
经过签名算法计算得出的签名值,详见签名生成算法 |
签名类型 |
sign_type |
否 |
String(32) |
HMAC-SHA256 |
签名类型,默认为MD5,支持HMAC-SHA256和MD5。 |
业务结果 |
result_code |
是 |
String(16) |
SUCCESS |
SUCCESS/FAIL |
错误代码 |
err_code |
否 |
String(32) |
SYSTEMERROR |
|
错误代码描述 |
err_code_des |
否 |
String(128) |
系统错误 |
错误信息描述 |
用户标识 |
openid |
是 |
String(128) |
wxd930ea5d5a258f4f |
用户在商户appid下的惟一标识 |
交易类型 |
trade_type |
是 |
String(16) |
JSAPI |
JSAPI、NATIVE、APP |
付款银行 |
bank_type |
是 |
String(16) |
CMC |
银行类型,采用字符串类型的银行标识 |
订单金额 |
total_fee |
是 |
Int |
100 |
订单总金额,单位为分 |
现金支付金额 |
cash_fee |
是 |
Int |
100 |
现金支付金额订单现金支付金额 |
微信支付订单号 |
transaction_id |
是 |
String(32) |
1217752501201407033233368018 |
微信支付订单号 |
商户订单号 |
out_trade_no |
是 |
String(32) |
20150806125346 |
商户系统的订单号,与请求一致。 |
... |
商户处理后同步返回给微信参数:
字段名 |
变量名 |
必填 |
类型 |
示例值 |
描述 |
返回状态码 |
return_code |
是 |
String(16) |
SUCCESS |
SUCCESS/FAIL SUCCESS表示商户接收通知成功并校验成功 |
返回信息 |
return_msg |
否 |
String(128) |
OK |
返回信息,如非空,为错误缘由: 签名失败 参数格式校验错误 |
该接口提供全部微信支付订单的查询,商户能够经过查询订单接口主动查询订单状态,完成下一步的业务逻辑。
须要调用查询接口的状况:
◆ 当商户后台、网络、服务器等出现异常,商户系统最终未接收到支付通知;
◆ 调用支付接口后,返回系统错误或未知交易状态状况;
◆ 调用被扫支付API,返回USERPAYING的状态;
◆ 调用关单或撤销接口API以前,需确认支付状态;
https://api.mch.weixin.qq.com/pay/orderquery
否
字段名 |
变量名 |
必填 |
类型 |
示例值 |
描述 |
公众帐号ID |
appid |
是 |
String(32) |
wxd678efh567hg6787 |
微信支付分配的公众帐号ID(企业号corpid即为此appId) |
商户号 |
mch_id |
是 |
String(32) |
1230000109 |
微信支付分配的商户号 |
微信支付订单号 |
transaction_id |
二选一 |
String(32) |
1217752501201407033233368018 |
微信的订单号,建议优先使用 |
商户订单号 |
out_trade_no |
String(32) |
20150806125346 |
商户系统内部的订单号,请确保在同一商户号下惟一。 |
|
随机字符串 |
nonce_str |
是 |
String(32) |
5K8264ILTKCH16CQ2502SI8ZNMTM67VS |
随机字符串,长度要求在32位之内。推荐随机数生成算法 |
签名 |
sign |
是 |
String(32) |
C380BEC2BFD727A4B6845133519F3AD6 |
经过签名算法计算得出的签名值,详见签名生成算法 |
签名类型 |
sign_type |
否 |
String(32) |
HMAC-SHA256 |
签名类型,默认为MD5,支持HMAC-SHA256和MD5。 |
字段名 |
变量名 |
必填 |
类型 |
示例值 |
描述 |
返回状态码 |
return_code |
是 |
String(16) |
SUCCESS |
SUCCESS/FAIL SUCCESS表示商户接收通知成功并校验成功 |
返回信息 |
return_msg |
否 |
String(128) |
签名失败 |
返回信息,如非空,为错误缘由: 签名失败 参数格式校验错误 |
如下字段在return_code为SUCCESS的时候有返回
字段名 |
变量名 |
必填 |
类型 |
示例值 |
描述 |
公众帐号ID |
appid |
是 |
String(32) |
wx8888888888888888 |
调用接口提交的公众帐号ID |
商户号 |
mch_id |
是 |
String(32) |
1900000109 |
调用接口提交的商户号 |
随机字符串 |
nonce_str |
是 |
String(32) |
5K8264ILTKCH16CQ2502SI8ZNMTM67VS |
|
签名 |
sign |
是 |
String(32) |
C380BEC2BFD727A4B6845133519F3AD6 |
微信返回的签名值,详见签名算法 |
业务结果 |
result_code |
是 |
String(16) |
SUCCESS |
SUCCESS/FAIL |
错误代码 |
err_code |
否 |
String(32) |
SYSTEMERROR |
错误码 |
错误代码描述 |
err_code_des |
否 |
String(128) |
系统错误 |
错误信息描述 |
如下字段在return_code 、result_code、trade_state都为SUCCESS时有返回 ,如trade_state不为 SUCCESS,则只返回out_trade_no(必传)和attach(选传)。
注:如下只列出了关键参数
字段名 |
变量名 |
必填 |
类型 |
示例值 |
描述 |
设备号 |
device_info |
否 |
String(32) |
013467007045764 |
微信支付分配的终端设备号 |
用户标识 |
openid |
是 |
String(128) |
oUpF8uMuAJO_M2pxb1Q9zNjWeS6o |
用户在商户appid下的惟一标识 |
交易类型 |
trade_type |
是 |
String(16) |
JSAPI |
调用接口提交的交易类型,取值以下:JSAPI,NATIVE,APP,MICROPAY |
交易状态 |
trade_state |
是 |
String(32) |
SUCCESS |
SUCCESS—支付成功 REFUND—转入退款 NOTPAY—未支付 CLOSED—已关闭 REVOKED—已撤销(刷卡支付) USERPAYING--用户支付中 PAYERROR--支付失败(其余缘由,如银行返回失败) |
标价金额 |
total_fee |
是 |
Int |
100 |
订单总金额,单位为分 |
现金支付金额 |
cash_fee |
是 |
Int |
100 |
现金支付金额订单现金支付金额 |
微信支付订单号 |
transaction_id |
是 |
String(32) |
1217752501201407033233368018 |
微信的订单号,建议优先使用 |
商户订单号 |
out_trade_no |
是 |
String(32) |
20150806125346 |
商户系统的订单号,与请求一致 |
交易状态描述 |
trade_state_desc |
是 |
String(256) |
支付失败,请从新下单支付 |
对当前查询订单状态的描述和下一步操做的指引 |
... |