微信支付 V3 RSA 加签踩坑
最近在做微信支付,根据微信官方文档上的要求 用RSA加签去请求支付窗口的调起,下面详细列举支付开发过程;
当前项目的流程大概是,前端根据后端要求提交数据-------》拿到后台返回的prepay_ID,和order_ID,-----》前端RSA加签------》调起微信的支付窗口----》支付。
myOderData(options){
const that=this;
let params={
datas:options,//提交订单数据的参数
method:'POST'
}
let paycode,OrderNo;
api.addorderData(params).then(res=>{
if(res.data.Success==false){
utils.msgtips(res.data.Msg);
}else{
paycode=res.data.Data.prepay_id;//拿到后台返回的prepay_id
OrderNo=res.data.Data.OrderNo;//拿到后台返回的订单号
// console.log(paycode);
let obj= utils.paysign(paycode); //RSA加签,此处已封装成paysign方法
utils.processPay(obj).then(res=>{//发起支付窗体的调起,已封装成processPay方法
if(res.errMsg=="requestPayment:ok"){//支付成功时,要传入订单号到后台改变订单状态
that.updateorderData(OrderNo)
}else if(res.errMsg=="requestPayment:fail cancel"){//取消支付时的操作
utils.msgtips('您已取消支付');
wx.navigateTo({
url:'../mppaycancel/index'
})
}
})
}
}).catch(err=>{
console.log(err)
})
以上是整体使用的方法。
下面讲解加签:
根据腾讯官方文档上的要求,如图:

文档原文地址: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_4.shtml
现在用的是v3 加签,以前是v2 MD5
需要注意的是加密加签的方式, 需要和后端保持一致。
1小程序ID获取:
const accountInfo = wx.getAccountInfoSync();
let appId=accountInfo.miniProgram.appId;
2.时间戳:
function createTimeStamp(){
return parseInt(new Date().getTime() / 1000) + ''
}
3.32位随机数:
function randomString(){
const chars='ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'; //默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1
const len=32;
const maxPos=chars.length;
let pwd='';
for(let i=0;i<len;i++){
pwd+=chars.charAt(Math.floor(Math.random()*maxPos));
}
return pwd;
}
4.订单详情扩展字符prepay_id:
即后端返回回来的prepay_id字段数据。
5.加签方式:
signType= 'RSA'
6.签名 paysign,这里要说明一下:
1).最好严格按照腾讯文档要求的顺序来。使用字段appId、timeStamp、nonceStr、package
2)要用‘\n’ 连接各字段,并且结尾也要用‘\n’ 不要用等于号。
官方文档有说明:链接:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_4.shtml
如图:

还有一个很重要的RSA加签:
这个我搜到2个博主提供的:
1):
demo:https://blog.csdn.net/UFO00001/article/details/72822907
github:https://github.com/UFO0001/WX_RSA
2)
https://github.com/zhangzhaopds/WeixinApp_RSA_Signature
第二种需要用小程序npm构建,照着文档操作就可以了,
npm构建文档如下:
https://developers.weixin.qq.com/miniprogram/dev/devtools/npm.html
我用的是第一个,直接页面引入了wx_rsa.js
如图:

function signLong (data) {
let sign_rsa = new RSA.RSAKey();
sign_rsa = RSA.KEYUTIL.getKey(privateKey);
let hashAlg = 'sha256';//sha256//此处换成腾讯要求的方式
let Sig = sign_rsa.signString(data, hashAlg);
Sig = RSA.hex2b64(Sig); // hex 转 b64
return Sig;
}
关于私钥:
一定要下载证书:

下载后打开此文件复制私钥粘贴到编辑器中,不能TXT 中复制,会改变编码方式,导致加签不成功。

腾讯官网有一个加签解签的验证工具,这个只能检测是否符合规范,不能检测值是否正确。地址:https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay6_0.shtml

function paysign(options){//发起支付签的字段准备
const accountInfo = wx.getAccountInfoSync();
let appId=accountInfo.miniProgram.appId,//小程序appid
timeStamp=createTimeStamp(),//时间戳
nonceStr=randomString(),//32位随机数
Ppackage= `prepay_id=${options}`,//prepay_id
signType= 'RSA';//加签方式
//appId、timeStamp、nonceStr、package
let PpaySign=`${appId}\n${timeStamp}\n${nonceStr}\n${Ppackage}\n`;//需要加签的字段拼接
let cryptStr=Rsa.signLong(PpaySign);//生成签名
let paySign=cryptStr;
return obj={timeStamp,nonceStr,Ppackage,signType,paySign};
}
//发起支付
function processPay(options){
// console.log(options)
let that=this;
return new Promise((resolve,reject)=>{
wx.requestPayment({
package:options.Ppackage,...options,
success: (res)=>{
resolve(res);
},
fail: (err)=>{
resolve(err);
}
});
})
}
以上就是完整的涉及到支付的一些方法和取值过程。
微信支付 V3 RSA 加签踩坑的更多相关文章
- 坑爹的微信支付v3,其实没有那么坑
http://www.cnblogs.com/zskbll/p/wxpay.html 研究微信开发一年多了,每个新接口,都会第一时间进行研究.微信支付开放很久,一直没机会接触到支付接口,等了好久终于从 ...
- 到处都是坑的微信支付V3之 微信支付回调页面
据上次 到处都是坑的微信支付V3 后很多园友在被虐了千百遍后终于跳转到了亲切的微信支付界面,但输入密码支付后却不知道怎么处理了,接下来补上支付后的处理流程. 1. html中根据前台支付后反馈信息成功 ...
- 到处都是坑的微信支付V3
业务需要一个在微信上能付款的功能,于是乎想到了最普遍的支付宝,坑爹的是T与A是水火不容啊,默默的还是接微信支付吧,没想到从此掉进了连环坑…… 网上写微信支付接口的还是很多,PHP官方有(鄙视源码作者, ...
- 为了Java微信支付V3开发包,我找出了微信支付文档至少六个错误
1. 前言 最近忙的一批,难得今天有喘气的机会就赶紧把最近在开发中的一些成果分享出来.前几日分享了自己写的一个微信支付V3的开发包payment-spring-boot-starter,就忙里偷闲完善 ...
- 微信支付 V3 开发教程(一):初识 Senparc.Weixin.TenPayV3
前言 我在 9 年前发布了 Senparc.Weixin SDK 第一个开源版本,一直维护至今,如今 Stras 已经破 7K,这一路上得到了 .NET 社区的积极响应和支持,也受到了非常多的宝贵建议 ...
- 微信支付v3发布到iis时的证书问题(转)
本文纯粹转载(原地址:微信支付v3发布到iis时的证书问题 ) 一开始报“出现了内部错误” 解决方法是 方法一 var cer = new X509Certificate(certpath, pass ...
- 微信支付 V3 的 Java 实现 Payment Spring Boot-1.0.7.RELEASE 发布
Payment Spring Boot 是微信支付V3的Java实现,仅仅依赖Spring内置的一些类库.配置简单方便,可以让开发者快速为Spring Boot应用接入微信支付. 功能特性 实现微信支 ...
- 微信支付[v3]
原文:微信支付[v3] V2升级V3 顺便记录一下 ,文档: http://pay.weixin.qq.com/wiki/doc/api/index.html !!! 支付授权目录与测试人的微信帐号白 ...
- RSA加密解密及RSA加签验签
RSA安全性应用场景说明 在刚接触RSA的时候,会混淆RSA加密解密和RSA加签验签的概念.简单来说加密解密是公钥加密私钥解密,持有公钥(多人持有)可以对数据加密,但是只有持有私钥(一人持有)才可以解 ...
随机推荐
- Dubbo服务分组
服务分组与多版本控制的使用方式几乎是相同的,只要将version替换为group即可.但使用目的不同.使用版本控制的目的是为了升级,将原有老版本替换掉,将来不再提供老版本的服务,所以不同版本间不能出现 ...
- linux系统下安装dubbo-admin
1.在安装dubbo-admin之前确保你得linux服务器上已经成功安装了jdk,tomcat, 若还没安装jdk以及tomcat则参考我的上一篇文章"linux环境下安装jdk,tomc ...
- 网页设计单位 px,em,rem,vm,vh,%
px(pixels) 像素 (px) 是一种绝对单位,因为无论其他相关的设置怎么变化,像素指定的值是不会变化的. px就是设备或者图片最小的一个点,比如常常听到的电脑像素是1024x768的,表示的是 ...
- 机器学习算法中的评价指标(准确率、召回率、F值、ROC、AUC等)
参考链接:https://www.cnblogs.com/Zhi-Z/p/8728168.html 具体更详细的可以查阅周志华的西瓜书第二章,写的非常详细~ 一.机器学习性能评估指标 1.准确率(Ac ...
- 【简】题解 AWSL090429 【价值】
先考虑当要选的物品一定时 显然有个贪心 wi越小的要越先选 所以先按wi从小到大拍序 因为发现正着递推要记录的状态很多 并且wi的贡献与后面选了几个物品有关 考虑正难则反 倒着递推 提前计算wi的贡献 ...
- Charles 手机抓包
Charles 手机抓包 请求抓包对于程序员调试代码必不可少,Charles是一个用与抓包的好工具(也可以使用Fiddler),Charles抓包是通过中间人代理实现,在客户端和服务端通信时,Char ...
- 二级C复习
二级C语言 队列 计算队列中元素个数 种 : rear > front ,直接减 第二种: rear < front 上面两种综合一起,求元素个数公式 :(r - f + maxsize) ...
- 2021 中国.NET开发者峰会 今日开幕
01 大会介绍 .NET Conf China 2021 是面向开发人员的社区峰会,基于 .NET Conf 2021的活动,庆祝 .NET 6 的发布和回顾过去一年来 .NET 在中国的发展成果展示 ...
- c#中Array,ArrayList 与List<T>的区别、共性与转换
本文内容来自我写的开源电子书<WoW C#>,现在正在编写中,可以去WOW-Csharp/学习路径总结.md at master · sogeisetsu/WOW-Csharp (gith ...
- 【论文笔记】 Denoising Implicit Feedback for Recommendation
Denoising Implicit Feedback for Recommendation Authors: 王文杰,冯福利,何向南,聂礼强,蔡达成 WSDM'21 新加坡国立大学,中国科学技术大学 ...