最近, 公司抽风, 项目中需要为我们小程序中"服务的商户"开通微信支付功能.
与同事们研究决定,还是申请为微信服务商比较靠谱~
但是~ 不靠谱的事来了. 废话不多说. 一步步的来.
第一步: 申请为服务商 ( 有重点!!!!!!!统一下单坑点之一 )
先去 公众平台 申请一个 服务号(只有服务号才可以支付和申请商户号,必须是认证过的.300元)
注意:保存好appId 与 appSecret 统一下单中的appId指的是这个!!!!!!!!!
申请完成后, 点击微信支付, 成为服务商,上传资料. 审核.300元
申请页面如下:(这个是已经申请好了的)
在这里, 说明一下. 微信支付服务商是从已经认证过的服务号里申请的, 默认与该服务号绑定 .微信乱七八糟的名字很多.这里的服务号指公众号.
申请小程序.交纳300元认证费. 注意:此次说明小程序主体信息与微信支付服务商主体信息一致(如果不一致请看官方坑爹文档)
申请开放平台~ 再来300元~ 在开放平台把公众号与小程序关联起来.
第二步:微信公众号服务号、小程序与微信支付服务商的账号准备好之后, 接下来配置微信支付服务商账号.
登录微信商户平台
进行配置 账户中心->API安全->设置秘钥
秘钥这是个大坑~~~留着.继续往下走.遇到了再回来
接下来是 服务商功能->特约商户申请
商户申请审批成功之后 (此时微信会给你邮箱发送特约商户的商户号和密码,与一般支付的那种商户号一样,可以登录)
特约商户管理->配置(还在服务商账号下)
这里的支付授权目录必须要正确. (别忘记了微信支付服务商的支付目录以及回调地址在服务商账户里设置!这里的回调是地址!是地址!是地址!和目录是有区别的!!!)
特约商户APPID配置.我们填写之前申请好的小程序appID.否则无法取到官方所为的sub_openId
第三步: 统一下单
根据官方的文档 https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_sl_api.php?chapter=9_1
去发起统一下单.
然后就是各种的报错!
商户ID与APPID不匹配
sub_openid and sub_appid not match
签名失败
等错误.
首先~ 你得保证,你的签名没有问题. 顺序正确,没有传入空值,不存在大小写错误,在签名验证工具中可以通过.如果还是报错签名失败~回到第二步, 服务商设置秘钥的那里. 来来回回的换吧~ 2到3次 基本就ok了
在这里, 对这个坑爹的参数表.做一下说明(写这文档的人~~~我就!@#@$%@#@!##$%你了!)
看这文档写的, openId 我是传还是不传?! 我去年买了个表的.不会说话嘛!
还有这个网页授权获取用户信息,很有歧义好嘛!
服务商模式下, 小程序支付.openId 不传! 不传! 不传! 签名的时候直接省略这个参数!
接下来说sub_openid. 坑啊~~~
这里尼玛就不是什么sub_openId 就尼玛是openId啊!!!!!!!! 哪来的?! wx.login 获得code 再通过code 换来的.
有人就高兴了. wx.login拿的openId啊? 我早就获得了~ 错!!!!! 不是这个!!! 虽然方法一样! 内容一样! 但是他给的确实是有问题的!这一步的登录不能省!继续往下看.!(去年买了个大表的! 文档你写清楚啊! 既然目的都是OpenId 为什么要取两次!你TM得告诉我这里不一样啊!)
对于openId的解释, 微信官方是说, 一个用户与多个小程序有多个openId,用户与一个小程序的openId唯一.
然后,经过测试:
wx.login({
success: function (login_success) {
wx.getUserInfo({
lang: 'zh_CN',
success: function (getUserInfo_success) {
var code = login_success.code
var encryptedData = getUserInfo_success.encryptedData
var iv = getUserInfo_success.iv
//在这里去换openId (之前我们项目中保存过一次小程序的openId 这时候再去取的时候, 变了~~ )
}
})
})
至此 统一下单 算是OK了. 接下来. 去排坑~ 调起支付~ 正在研究中~ 后期补全
在微信支付之后,小程序会主动向服务端发送支付状态.为了防止恶意篡改,必须生成签名发送给服务端进行验证.
签名生成官方文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3
签名验证分为如下几步:
1.与服务端确认上传的签名内容(即上传参数key=value)以及加密方式.并且要到商户平台设置的密钥key.
2.生成随机字符串nonceStr.
3.将要上传的参数,对参数按照key=value的格式,并按照参数名ASCII字典序排序,比如:
假设传送的参数如下:
appid: wxd930ea5d5a258f4f
mch_id: 10000100
device_info: 1000
body: test
nonce_str: ibuaiVcKdpRxkhJA
则:stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=10000100&nonce_str=ibuaiVcKdpRxkhJA"
4.拼接API密钥,例如:stringSignTemp=stringA+"&key=192006250b4c09247ec02edce69f6a2d" //注:key为商户平台设置的密钥key
5.对拼接秘钥后的字符串进行加密并且转换为大写.(加密方式自定)
6.将参数以及加密得到的sign一起上传给服务端进行验证.
7.查看服务端返回结果.
谢谢大家~
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)