最近在做微信支付,根据微信官方文档上的要求 用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 加签踩坑的更多相关文章

  1. 坑爹的微信支付v3,其实没有那么坑

    http://www.cnblogs.com/zskbll/p/wxpay.html 研究微信开发一年多了,每个新接口,都会第一时间进行研究.微信支付开放很久,一直没机会接触到支付接口,等了好久终于从 ...

  2. 到处都是坑的微信支付V3之 微信支付回调页面

    据上次 到处都是坑的微信支付V3 后很多园友在被虐了千百遍后终于跳转到了亲切的微信支付界面,但输入密码支付后却不知道怎么处理了,接下来补上支付后的处理流程. 1. html中根据前台支付后反馈信息成功 ...

  3. 到处都是坑的微信支付V3

    业务需要一个在微信上能付款的功能,于是乎想到了最普遍的支付宝,坑爹的是T与A是水火不容啊,默默的还是接微信支付吧,没想到从此掉进了连环坑…… 网上写微信支付接口的还是很多,PHP官方有(鄙视源码作者, ...

  4. 为了Java微信支付V3开发包,我找出了微信支付文档至少六个错误

    1. 前言 最近忙的一批,难得今天有喘气的机会就赶紧把最近在开发中的一些成果分享出来.前几日分享了自己写的一个微信支付V3的开发包payment-spring-boot-starter,就忙里偷闲完善 ...

  5. 微信支付 V3 开发教程(一):初识 Senparc.Weixin.TenPayV3

    前言 我在 9 年前发布了 Senparc.Weixin SDK 第一个开源版本,一直维护至今,如今 Stras 已经破 7K,这一路上得到了 .NET 社区的积极响应和支持,也受到了非常多的宝贵建议 ...

  6. 微信支付v3发布到iis时的证书问题(转)

    本文纯粹转载(原地址:微信支付v3发布到iis时的证书问题 ) 一开始报“出现了内部错误” 解决方法是 方法一 var cer = new X509Certificate(certpath, pass ...

  7. 微信支付 V3 的 Java 实现 Payment Spring Boot-1.0.7.RELEASE 发布

    Payment Spring Boot 是微信支付V3的Java实现,仅仅依赖Spring内置的一些类库.配置简单方便,可以让开发者快速为Spring Boot应用接入微信支付. 功能特性 实现微信支 ...

  8. 微信支付[v3]

    原文:微信支付[v3] V2升级V3 顺便记录一下 ,文档: http://pay.weixin.qq.com/wiki/doc/api/index.html !!! 支付授权目录与测试人的微信帐号白 ...

  9. RSA加密解密及RSA加签验签

    RSA安全性应用场景说明 在刚接触RSA的时候,会混淆RSA加密解密和RSA加签验签的概念.简单来说加密解密是公钥加密私钥解密,持有公钥(多人持有)可以对数据加密,但是只有持有私钥(一人持有)才可以解 ...

随机推荐

  1. Linux基础命令---nslookup查询域名工具

    nslookup nslookup是一个查询DNS域名的工具,它有交互和非交互两种工作模式. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.Fedora.   1.语法     ...

  2. Linux基础命令---mail邮件管理程序

    mail mail是一个邮件的管理程序,可以用来发送或者接收邮件. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.Fedora.   1.语法       mail  [选项] ...

  3. HelloWorldMBean

    package mbeanTest; public interface HelloWorldMBean { public String getHello(); public void setHello ...

  4. Local Classes in C++

    A class declared inside a function becomes local to that function and is called Local Class in C++. ...

  5. DOM解析xml学习笔记

    一.dom解析xml的优缺点 由于DOM的解析方式是将整个xml文件加载到内存中,转化为DOM树,因此程序可以访问DOM树的任何数据. 优点:灵活性强,速度快. 缺点:如果xml文件比较大比较复杂会占 ...

  6. centos源码部署lua-5.3

    目录 一.介绍 二.部署 三.测试 一.介绍 Luat语言是在1993年由巴西一个大学研究小组发明,其设计目标是作为嵌入式程序移植到其他应用程序,它是由C语言实现的,虽然简单小巧但是功能强大. 二.部 ...

  7. 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( ...

  8. java多线程6:ReentrantLock

    下面看下JUC包下的一大并发神器ReentrantLock,是一个可重入的互斥锁,具有比synchronized更为强大的功能. ReentrantLock基本用法 先来看一下ReentrantLoc ...

  9. Mybatis中原生DAO实现和Mapper动态代理实现

    Mybatis开发dao的方法通常用两种,一种是传统DAO的方法,另一种是基于mapper代理的方法. 一.传统DAO方式开发 1.sql语句映射文件编写 User.xml <?xml vers ...

  10. nim_duilib(4)之CheckBox

    introduction 更多控件用法,请参考 here 和 源码. 本文的代码基于这里 xml文件添加代码 基于上一篇, 继续向basic.xml中添加下面关于CheckBox的代码. xml完整源 ...