微信支付 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加签验签的概念.简单来说加密解密是公钥加密私钥解密,持有公钥(多人持有)可以对数据加密,但是只有持有私钥(一人持有)才可以解 ...
随机推荐
- Linux基础命令---nslookup查询域名工具
nslookup nslookup是一个查询DNS域名的工具,它有交互和非交互两种工作模式. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.Fedora. 1.语法 ...
- Linux基础命令---mail邮件管理程序
mail mail是一个邮件的管理程序,可以用来发送或者接收邮件. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.Fedora. 1.语法 mail [选项] ...
- HelloWorldMBean
package mbeanTest; public interface HelloWorldMBean { public String getHello(); public void setHello ...
- Local Classes in C++
A class declared inside a function becomes local to that function and is called Local Class in C++. ...
- DOM解析xml学习笔记
一.dom解析xml的优缺点 由于DOM的解析方式是将整个xml文件加载到内存中,转化为DOM树,因此程序可以访问DOM树的任何数据. 优点:灵活性强,速度快. 缺点:如果xml文件比较大比较复杂会占 ...
- centos源码部署lua-5.3
目录 一.介绍 二.部署 三.测试 一.介绍 Luat语言是在1993年由巴西一个大学研究小组发明,其设计目标是作为嵌入式程序移植到其他应用程序,它是由C语言实现的,虽然简单小巧但是功能强大. 二.部 ...
- Python把两个列表索引相同的值相加
方案一 list1=[1,2,3,4,5] list2=[6,7,8,9,10] list3=[] list3=[i + j for i, j in zip(list1, list2)] print( ...
- java多线程6:ReentrantLock
下面看下JUC包下的一大并发神器ReentrantLock,是一个可重入的互斥锁,具有比synchronized更为强大的功能. ReentrantLock基本用法 先来看一下ReentrantLoc ...
- Mybatis中原生DAO实现和Mapper动态代理实现
Mybatis开发dao的方法通常用两种,一种是传统DAO的方法,另一种是基于mapper代理的方法. 一.传统DAO方式开发 1.sql语句映射文件编写 User.xml <?xml vers ...
- nim_duilib(4)之CheckBox
introduction 更多控件用法,请参考 here 和 源码. 本文的代码基于这里 xml文件添加代码 基于上一篇, 继续向basic.xml中添加下面关于CheckBox的代码. xml完整源 ...