一、确保请求参数正确性
1、在进行getbrandwcpayrequest请求时,需要对请求参数进行正确性检查。以下是getbrandwcpayrequest请求中需要传递的参数:
appid:公众账号ID mch_id:商户号 nonce_str:随机字符串,不长于32位 body:商品或支付单简要描述 out_trade_no:商户订单号 total_fee:总金额,单位为分 spbill_create_ip:用户端实际ip notify_url:接收微信支付异步通知回调地址 trade_type:交易类型,取值如下:JSAPI,NATIVE,APP等 product_id:trade_type=NATIVE时,此参数必传。此参数为二维码中包含的商品ID,商户自行定义。 openid:trade_type为JSAPI时,此参数必传,用户在商户appid下的唯一标识。
2、在传递参数时,需要注意参数名一定要使用小写字母,例如appid、mch_id、nonce_str等。同时,参数值需要进行urlencode编码。
appid=wx2421b1c4370ec43b mch_id=10000100 nonce_str=IITRi8Iabbblz1Jc body=%E8%AE%A2%E5%8D%95%E4%B8%AD%E8%B4%AD out_trade_no=1415659990 total_fee=1 spbill_create_ip=14.23.150.211 notify_url=http%3A%2F%2Fwxpay.wxutil.com%2Fpay.php trade_type=JSAPI openid=oUpF8uMuAJO_M2pxb1Q9zNjWeS6o
3、对于参数值中含有特殊字符(如#、&、+等)的情况,需要在urlencode编码前进行转义。例如,传递的商品名称中含有#字符,需要将#转义成%23,再进行urlencode编码。
二、生成签名
1、在传递请求参数正确性检查无误的情况下,需要对所有请求参数进行签名,以保证请求的安全性。签名生成算法使用的是MD5算法。以下是MD5签名生成的步骤:
2、将所有请求参数按照参数名字典序排序(ASCII码顺序)后,使用"&"符号连接起来,得到一个字符串。
3、在该字符串后面拼接上商户的API密钥,得到一个完整的字符串。
4、对该完整字符串进行MD5运算,得到签名值。
5、将签名值作为参数添加到请求参数中。
{ "appid":"wx2421b1c4370ec43b", "attach":"支付测试", "body":"JSAPI支付测试", "mch_id":"10000100", "nonce_str":"1add1a30ac87aa2db72f57a2375d8fec", "notify_url":"http://wxpay.wxutil.com/pub_v2/pay/notify.v2.php", "openid":"oUpF8uMuAJO_M2pxb1Q9zNjWeS6o", "out_trade_no":"1415659990", "spbill_create_ip":"14.23.150.211", "total_fee":"1", "trade_type":"JSAPI", "sign":"0CB01533B8C1EF103065174F50BCA001" }
三、发送请求并获取结果
1、在生成签名后,将所有请求参数及其签名值作为XML格式的字符串发送给微信支付服务器。以下是getbrandwcpayrequest请求的XML示例:
wx2421b1c4370ec43b 支付测试 JSAPI支付测试10000100 1add1a30ac87aa2db72f57a2375d8fec http://wxpay.wxutil.com/pub_v2/pay/notify.v2.php oUpF8uMuAJO_M2pxb1Q9zNjWeS6o 1415659990 14.23.150.211 1 JSAPI 0CB01533B8C1EF103065174F50BCA001
2、微信支付服务器将会返回XML格式的结果给商户服务器。以下是getbrandwcpayrequest请求返回的XML示例:
3、商户服务器需要对返回结果进行解析,并处理其中的响应参数。根据返回结果中的prepay_id,商户便可在微信支付服务器通过JSAPI发起用户支付。