微信公众号支付 (参数配置问题)

微信公众号支付目前支持两种调用方式

第一种: 微信内H5调起支付 (详见:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6)

function onBridgeReady(){
   WeixinJSBridge.invoke(
       'getBrandWCPayRequest', {
           "appId":"wx2421b1c4370ec43b",     //公众号名称,由商户传入     
           "timeStamp":"1395712654",         //时间戳,自1970年以来的秒数     
           "nonceStr":"e61463f8efa94090b1f366cccfbbb444", //随机串     
           "package":"prepay_id=u802345jgfjsdfgsdg888",     
           "signType":"MD5",         //微信签名方式:     
           "paySign":"70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名 
       },
       function(res){     
           if(res.err_msg == "get_brand_wcpay_request:ok" ) {}     // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回    ok,但并不保证它绝对可靠。 
       }
   ); 
}

好的, 接下来我们聊一聊参数

名称 变量名 必填 类型 示例值 描述
公众号id appId String(16) wx8888888888888888 商户注册具有支付权限的公众号成功后即可获得
时间戳 timeStamp String(32) 1414561699 当前的时间,自1970年以来的秒数. 其他详见时间戳规则
随机字符串 nonceStr String(32) 5K8264ILTKCH16CQ2502SI8ZNMTM67VS 随机字符串,不长于32位。推荐随机数生成算法
订单详情扩展字符串 package String(128) prepay_id=123456789 统一下单接口返回的prepay_id参数值,提交格式如:prepay_id=***
签名方式 signType String(32) MD5 签名类型,默认为MD5,支持HMAC-SHA256和MD5。注意此处需与统一下单的签名类型一致
签名 paySign String(64) C380BEC2BFD727A4B6845133519F3AD6 签名,详见签名生成算法

appId 不用讲, 公司申请微信公众号的时候就会给到开发者
timeStamp 时间戳,自1970年以来的秒数 let timestamp = Date.parse(new Date()).toString()
nonceStr 微信支付API接口协议中包含字段nonce_str,主要保证签名不可预测。我们推荐生成随机数算法如下:调 用随机数函数生成,将得到的值转换为字符串。
package 统一下单接口返回的prepay_id参数值,提交格式如:prepay_id=*** (这个我们后面会详细介绍)
paySign 这个就比较复杂了

  • 第一步

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

  • 第二步

在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
◆ key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置

举例:
假设传送的参数如下:

appid:  wxd930ea5d5a258f4f
mch_id: 10000100
device_info:    1000
body:   test
nonce_str:  ibuaiVcKdpRxkhJA

第一步:对参数按照key=value的格式,并按照参数名ASCII字典序排序如下:

stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=10000100&nonce_str=ibuaiVcKdpRxkhJA";

第二步:拼接API密钥:

stringSignTemp=stringA+"&key=192006250b4c09247ec02edce69f6a2d" //注:key为商户平台设置的密钥key
sign=MD5(stringSignTemp).toUpperCase()="9A0A8659F005D6984697E2CA0A9CF3B7" //注:MD5签名方式
sign=hash_hmac("sha256",stringSignTemp,key).toUpperCase()="6A9AE1657590FD6257D693A078E1C3E4BB6BA4DC30B23E0EE2496E54170DACD6" //注:HMAC-SHA256签名方式

OK 啦 ! 现在你可以用第一种方式调起微信支付了.

第二种: 微信js-sdk支付(https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115)

wx.chooseWXPay({
timestamp: 0, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
nonceStr: '', // 支付签名随机串,不长于 32 位
package: '', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)
signType: '', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
paySign: '', // 支付签名
success: function (res) {
// 支付成功后的回调函数
}
});

关于参数 , 微信官方文档有一行备注:
prepay_id 通过微信支付统一下单接口拿到,paySign 采用统一的微信支付 Sign 签名生成方法,注意这里 appId 也要参与签名,appId 与 config 中传入的 appId 一致,即最后参与签名的参数有appId, timeStamp, nonceStr, package, signType。

实例代码

let strA = "appId="+appId+"&nonceStr="+nonce_str+"&package=prepay_id="+prepay_id+"&signType=MD5"+"&timeStamp="+timestamp;
let stringSignTemp=strA+"&key=************123";
let sign=md5(stringSignTemp).toUpperCase();

跟第一种方式用到的参数一毛一样有木有!
这时不知道你有没有注意到参数里面有一个package

package: '', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)

统一支付接口 ???

嗯嗯, 接下来我们就再讲讲这个"统一支付接口"

艾玛 太多了, 自己看吧
(详见:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1)

你可能感兴趣的:(微信公众号支付 (参数配置问题))