微信支付开发 - 扫码支付(模式二)

 

关键字:微信支付动态native支付、扫码支付、扫码支付模式二、统一支付

 

一、支付场景

用户扫描商户展示在各种场景的二维码进行支付。

步骤1:商户根据微信支付的规则,为不同商品生成不同的二维码(如图1.1),展示在各种场景,用于用户扫描购买。

步骤2:用户使用微信“扫一扫”(如图1.2)扫描二维码后,获取商品支付信息,引导用户完成支付(如图1.3)。

 

       

            1.1支付二维码                 图1.2打开微信扫一扫                                1.3 支付确认页面

 

步骤(3):用户确认支付,输入支付密码(如图1.4)。

步骤(4):支付完成后会提示用户支付成功(如图1.5),商户后台得到支付成功的通知,然后进行发货处理。

        

    图1.4用户确认支付,输入密码                              1.5 支付成功提示

 

二、参数格式

发送和接收参数格式均为XML格式。

三、签名算法

第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA

特别注意以下重要规则:

◆ 参数名ASCII码从小到大排序(字典序);

◆ 如果参数的值为空不参与签名;

◆ 参数名区分大小写;

◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。

◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段

 

第二步,stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到signsignValue

key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置

 

四、调用流程

商户后台系统调用微信支付统一下单API】生成预付交易,将接口返回的链接生成二维码,用户扫码后输入密码完成支付交易。

用户支付后,微信将支付结果通知【统一下单API中配置的notify_url链接地址,商户后台系统拿到支付结果后做相应的订单状态变更。

商户后台可根据订单号或者微信订单号,调用订单查询API】查询订单支付状态。

注意:该模式的预付单有效期为2小时,过期后无法支付。

五、统一下单

1.接口链接

https://api.mch.weixin.qq.com/pay/unifiedorder

2.是否需要证书

3.请求参数

注:以下只列出了关键参数

字段名

变量名

必填

类型

示例值

描述

公众账号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-SHA256MD5

商品描述

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和网页支付提交用户端ipNative支付填调用微信支付API的机器IP

通知地址

notify_url

String(256)

http://www.weixin.qq.com/wxpay/pay.php

异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。

交易类型

trade_type

String(16)

NATIVE

取值如下:JSAPINATIVEAPP

商品ID

product_id

String(32)

12235413214070356458058

trade_type=NATIVE时(即扫码支付),此参数必传。此参数为二维码中包含的商品ID,商户自行定义。

....

 

4.返回参数

字段名

变量名

必填

类型

示例值

描述

返回状态码

return_code

String(16)

SUCCESS

SUCCESS/FAIL此字段是通信标识,非交易标识,交易是否成功需要查看result_code来判断

返回信息

return_msg

String(128)

签名失败

返回信息,如非空,为错误原因

签名失败

参数格式校验错误

 

以下字段在return_codeSUCCESS的时候有返回

字段名

变量名

必填

类型

示例值

描述

公众账号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

交易类型,取值为:JSAPINATIVEAPP

预支付交易会话标识

prepay_id

String(64)

wx201410272009395522657a690389285100

 

二维码链接

code_url

String(64)

weixin//wxpay/s/An4baqw

trade_typeNATIVE时有返回,用于生成二维码,展示给用户进行扫码支付

5.示例代码

 

 

六、支付结果通知

1.说明

支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。

对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。(通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒)

注意:

   同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。

   特别提醒:商户系统对于支付结果通知的内容一定要做签名验证,并校验返回的订单金额是否与商户侧的订单金额一致,防止数据泄漏导致出现“假通知”,造成资金损失。

 

2.接口链接

【统一下单API】中提交的参数notify_url,如果链接无法访问,商户将无法接收到微信通知。

注意:

   通知url必须为直接可访问的url,不能携带参数。示例:notify_url:“https://pay.weixin.qq.com/wxpay/pay.action”。

 

3.是否需要证书

4.通知参数

 

字段名

变量名

必填

类型

示例值

描述

返回状态码

return_code

String(16)

SUCCESS

SUCCESS/FAIL此字段是通信标识,非交易标识,交易是否成功需要查看result_code来判断

返回信息

return_msg

String(128)

签名失败

返回信息,如非空,为错误原因

签名失败

参数格式校验错误

 

以下字段在return_codeSUCCESS的时候有返回

注:以下只列出了关键参数

字段名

变量名

必填

类型

示例值

描述

公众账号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-SHA256MD5

业务结果

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

JSAPINATIVEAPP

付款银行

bank_type

String(16)

CMC

银行类型,采用字符串类型的银行标识

订单金额

total_fee

Int

100

订单总金额,单位为分

现金支付金额

cash_fee

Int

100

现金支付金额订单现金支付金额

微信支付订单号

transaction_id

String(32)

1217752501201407033233368018

微信支付订单号

商户订单号

out_trade_no

String(32)

20150806125346

商户系统的订单号,与请求一致。

...

 

5.返回参数

商户处理后同步返回给微信参数:

字段名

变量名

必填

类型

示例值

描述

返回状态码

return_code

String(16)

SUCCESS

SUCCESS/FAIL

SUCCESS表示商户接收通知成功并校验成功

返回信息

return_msg

String(128)

OK

返回信息,如非空,为错误原因:

签名失败

参数格式校验错误

 

七、订单查询

1.使用场景

该接口提供所有微信支付订单的查询,商户可以通过查询订单接口主动查询订单状态,完成下一步的业务逻辑。

需要调用查询接口的情况:

◆ 当商户后台、网络、服务器等出现异常,商户系统最终未接收到支付通知;

◆ 调用支付接口后,返回系统错误或未知交易状态情况;

◆ 调用被扫支付API,返回USERPAYING的状态;

◆ 调用关单或撤销接口API之前,需确认支付状态;

 

2.接口链接

https://api.mch.weixin.qq.com/pay/orderquery

3.是否需要证书

4.请求参数

字段名

变量名

必填

类型

示例值

描述

公众账号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-SHA256MD5

 

 

5.返回参数

字段名

变量名

必填

类型

示例值

描述

返回状态码

return_code

String(16)

SUCCESS

SUCCESS/FAIL

SUCCESS表示商户接收通知成功并校验成功

返回信息

return_msg

String(128)

签名失败

返回信息,如非空,为错误原因:

签名失败

参数格式校验错误

 

以下字段在return_codeSUCCESS的时候有返回

字段名

变量名

必填

类型

示例值

描述

公众账号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_codetrade_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

调用接口提交的交易类型,取值如下:JSAPINATIVEAPPMICROPAY

交易状态

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)

支付失败,请重新下单支付

对当前查询订单状态的描述和下一步操作的指引

...

 

 

6.示例代码

 

posted @ 2017-04-01 17:15  SuperLeon  阅读(3758)  评论(0编辑  收藏  举报