因项目需要,对接了微信支付,微信支付对于网页来说没有什么工作量,申请了商户号后,直接将收款码放到网页上就可以,但是小程序需要调起微信支付直接付款,于是认真翻阅了官网要针对小程序做微信支付的对接。

准备工作

按照微信官网,准备以下材料:

  1. 微信商户号
  2. 申请商户api证书
  3. 商户证书序列号
  4. 设置api v3的密钥
  5. 一个关联好相关商户的小程序

流程

根据官网要求小程序支付的流程应该是先调用下单接口,然后再调用调起支付,再接收微信支付通知,获取支付状态。如果有其他原因未完成支付,要调用关闭订单接口。
这里主要写服务端的主要工作流程。

签名

调用微信接口就不能没有签名,这里就不得不骂一句微信,在小程序支付文档的接口中没有明确写明需要签名,只在错误代码中提了签名错误,真的是很害怕人一下就看到要签名吗。在官网开发指南-签名生成可以查看到签名生成的具体步骤,但是因为我的项目使用的是node做服务端,并不能使用样例代码,也不能使用sdk,只能自己写了。

  1. 要加载商户api证书的私钥,使用sha256withrsa算法加密。
// 读取证书私钥
var getKey = function (){let path = './apiclient_key.pem';let data = fs.readFileSync(path, 'utf-8');return  data;
};
// 计算签名
var sign = function (hashType,content) {// 将字符串进行utf-8编码let string = new Buffer(content);let stringUtf8 = string.toString('utf-8');privateKey = getKey();// 获取加密方式let hash = HashMap[hashType]// 创建 Signature 对象const signature = new KJUR.crypto.Signature({alg: hash,//!这里指定 私钥 pem!prvkeypem: privateKey})signature.updateString(stringUtf8)const signData = signature.sign()// 将内容转成base64return hextob64(signData);
}

这里使用了第三方插件 KJUR来进行具体的签名算法,这步需要注意的点有以下几种:

  • 将明文加密的第一步,一定要先将明文进行utf-8编码,这部分只在官网给出的样例代码中有,并没有在说明中指出,一开始我就忽略了这一点。
  • 一定要下载官网sdk工具中的验签工具,这个工具会给出相对与返回信息具体的多的签名错误,当然也不是完全的,但大部部分都是有的。
  • 按照官网所说,将签名和签名信息放置在http请求头Authorization属性中时,一定要在使用引号的地方使用双引号,我反复验证了我的签名,验证工具也验证通过了,最后抱着试试的心态,换了下引号,就完全好用了,习惯使用node的话一定要注意这里的单引号和双引号的区别。

验签

服务端对接微信支付的流程工作除了生成签名就是验签了,应微信官网要求,支付通知请求必须要验证他的签名。验签需要api v3密钥,这个是直接在微信商户设置的。

获取平台证书公钥

我们要想验签,按照官网流程,我们首先要获取微信平台证书并导出公钥。使用公钥来进行验签。
请求平台证书的请求也要添加上述签名。
获取到证书后,就涉及到从中读取公钥,并且设置为之后可读,不要每次都去请求证书。同时平台证书有有效期希望通过代码来实现平滑自动更换相关的公钥。
使用了crypto模块的下述方法,但不幸的是,由于我们项目的node版本过低,无法使用这个方法,于是只能放弃自动存入,改为解析后手动导出公钥,以后验签使用已经存储好的公钥文件。

crypto.createPublicKey(decoded)

解密获取证书

另外想要拿到证书文件必须要做的就是解密,微信给出的响应都是加密的,要按照微信要求去解密。,解密方法如下:

  // 将base64编码解码let ciphertext = Buffer.from(string, 'base64');let key = setting.weixinPay.api3;// 解密证书let authTag = ciphertext.slice(ciphertext.length - 16);let data = ciphertext.slice(0, ciphertext.length - 16);let decipher = crypto.createDecipheriv('aes-256-gcm', key, nonce);decipher.setAuthTag(Buffer.from(authTag));decipher.setAAD(Buffer.from(associated_data));let decoded = decipher.update(data, null, 'utf8');try {decipher.final();} catch (error) {console.log(error);}logUtil.error('decoded: ' + decoded);
  • 上述代码中try catch部分是有一个报错的,但是没有明白为什么报错,同时,也能在上步直接获取解密的信息,所以此处就忽略了它,如果不加这个final的话,解密文件后面会有一部分乱码,所以还是保留了这句,不处理他的错误信息。
  • 另外伤处代码解析的证书,我存储成文件了,后来通过命令行导出证书的公钥,并存为文件。

验签

根据官网要求生成验签串,并获取签名,进行验签。

var verify = function(hashType,pv,str,sign){// 获取加密方式let hash = HashMap[hashType]try {let signatureVf = new KJUR.crypto.Signature({alg:hash,prvkeypem:pv});signatureVf.updateString(str);// 验签入参是16进制字符串,注意转码let b = signatureVf.verify(b64tohex(sign));return b;} catch (error) {logUtil.error(error);}}
  • 获取的请求体一定是object,要想征程生成验签名串,要将其转化成字符串使用

验签过后,就可以解密请求主体,获取参数,进行业务逻辑了。解密方法和上述解密证书是相同方法,就不再重复放,只是要注意以下内容。

  • 使用express框架的时候,接收post参数不能简单的使用req.body,要使用let form = new formidable.IncomingForm();来接收参数,如果不成功接收到请求主体,那么验签是不能过的。

node 对接微信支付的踩坑记录(服务端)相关推荐

  1. 微信APP支付的踩坑记录(一):prepay_id 与 prepayid

    最近在做微信APP支付时,发现报下面这个错误: -1 错误 可能的原因:签名错误.未注册APPID.项目设置APPID不正确.注册的APPID与设置的不匹配.其他异常等. 用微信签名校验工具校验签名又 ...

  2. Vue项目对接微信公众号踩坑日记

    之前做项目都是pc端的,还是第一次做移动端项目,而且上来就要接入app 和微信公众号两个平台,最终查阅多方文档,耗费几周时间还是完成了项目,这篇文章也算是记录一下自己的完成思路以及一些想法,希望能帮到 ...

  3. 微信小游戏踩坑记录(二)

    2019独角兽企业重金招聘Python工程师标准>>> 微信视频组件 这次是关于视频组件的,creator的视频组件在小游戏中是没有用的,只能使用小游戏自带的组件.使用小游戏Vide ...

  4. 微信小程序踩坑记录 ------- canvas 生成带小程序码的微信朋友圈分享图

    最近做了一个问卷类的小程序,其中的结果页想让用户进行朋友圈分享转发,网上搜索资料,得出解决思路,用 canvas 将页面绘制生成图片,然后保存到手机相册,最终效果如下: 在这里我只写页面里关于 can ...

  5. 微信开放标签踩坑记录

    先上微信官方文档 微信文档 以下要注意的点: 微信版本要求为:7.0.12及以上. 系统版本要求为:iOS 10.3及以上.Android 5.0及以上. 微信sdk版本需要在1.6.0以上,版本过低 ...

  6. 微信小程序踩坑之pc端小程序的上传图片失败没有上传成功

    注:pc端是指从微信里左下角的小程序面板进入的小程序 首先微信小程序上传图片方法都是 这里后台是用了oss wx.chooseImage({count: that.data.count - that. ...

  7. Canal 及canal.admin(v1.1.5)踩坑记录

    网址:GitHub - alibaba/canal: 阿里巴巴 MySQL binlog 增量订阅&消费组件 前期软件准备 上面的软件包(canal.deployer-1.1.5.tar.gz ...

  8. 微信退款 java工具类,微信支付中退款踩坑记录

    首先附上微信支付的开发者文档 其实这里所说的踩坑记录,无非就是微信在开发者文档上的写不太明确,也没有比较官方的demo,在此列出一个可行的demo,供大家下载使用. 主要问题就是在这几步解密上 微信的 ...

  9. 微信客服机器人(踩坑记录、SpringBoot、企业微信)

    微信客服机器人(踩坑记录.SpringBoot.企业微信) 转载请注明出处:https://www.jjput.com/archives/wei-xin-ke-fu-ji-qi-ren 总体流程 当有 ...

最新文章

  1. Git fetch和git pull的区别
  2. Elasticsearch - 索引管理
  3. Ubuntu/Deepin--How to remove packeges?
  4. javaweb k8s_阿里云部署K8Sweb项目
  5. Android开发之运行客户的Demo拿不到数据
  6. JavaScript变量提升
  7. JavaScript开发工具--Aptana
  8. 配置使用4台主机实现12台主机的集群
  9. mysql int 拼接_MySQL 修改int类型为bigint SQL语句拼接
  10. 求贤令|诚邀3D视觉领域技术大咖加入工坊!
  11. MyBatis(九)------MyBatis的优缺点知多少
  12. SPSS教程—进行皮尔逊相关性分析的步骤
  13. html简单的网页制作
  14. 输出0~1000内的质数 C语言
  15. MDIO总线简单介绍
  16. 修改密码 -测试用例设计
  17. 挂耳式蓝牙耳机性价比推荐,盘点五款性能高的耳机分享
  18. PyTorch实现基于卷积神经网络的面部表情识别
  19. 10 本 Android PDF 书籍免费分享
  20. 简单的汇率转换工具---初试AJAX

热门文章

  1. 五柳先生传(陶渊明)
  2. 中介者(Mediator)
  3. 个人商业模式,如何让自己变得值钱
  4. 2023 HGAME网络攻防大赛wp
  5. 从刚体动力学方程到 MATLAB 多种方法仿真验证
  6. Thinkphp框架的源码通读1
  7. 5.22 综合案例2.0-4G远程遥控车DEMO(2.2版本接口有更新)
  8. Presto 在美图的实践
  9. 程序人生 | 阿里面试小记
  10. 谷歌浏览器linux,windows下载