微信支付 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加签验签的概念.简单来说加密解密是公钥加密私钥解密,持有公钥(多人持有)可以对数据加密,但是只有持有私钥(一人持有)才可以解 ...
随机推荐
- 时光网内地影视票房Top100爬取
为了和艺恩网的数据作比较,让结果更精确,在昨天又写了一个时光网信息的爬取,这次的难度比艺恩网的大不少,话不多说,先放代码 # -*- coding:utf-8 -*-from __future__ i ...
- ES安装简记
JDK # java -versionjava version "1.8.0_231"Java(TM) SE Runtime Environment (build 1.8.0_23 ...
- freeswitch APR库线程读写锁
概述 freeswitch的核心源代码是基于apr库开发的,在不同的系统上有很好的移植性. 线程读写锁在多线程服务中有重要的作用.对于读数据比写数据频繁的服务,用读写锁代替互斥锁可以提高效率. 由于A ...
- MySQL数据库如何实现增量备份
1 .通过SHOW VARIABLES LIKE '%log_bin%';查看数据库是否开启增量备份log_bin=ON则为开启log_bin=OFF则为关闭 2 .修改mysql配置文件mysql. ...
- java多线程6:ReentrantLock
下面看下JUC包下的一大并发神器ReentrantLock,是一个可重入的互斥锁,具有比synchronized更为强大的功能. ReentrantLock基本用法 先来看一下ReentrantLoc ...
- hooks中,useState异步问题解决方案
问题描述: 在hooks中,修改状态的是通过useState返回的修改函数实现的.它的功能类似于class组件中的this.setState().而且,这两种方式都是异步的.可是this.setSta ...
- <转>git,github在windows上的搭建
http://www.cnblogs.com/yixiaoyang/archive/2012/01/06/2314190.html Git在源码管理领域目前占很大的比重了,而且开源的项目很多都转到Gi ...
- 减轻内存负担,在 pymysql 中使用 SSCursor 查询结果集较大的 SQL
前言 默认情况下,使用 pymysql 查询数据使用的游标类是 Cursor,比如: import pymysql.cursors # 连接数据库 connection = pymysql.conne ...
- 谱聚类算法—Matlab代码
% ========================================================================= % 算 法 名 称: Spectral Clus ...
- [BUUCTF]PWN8——jarvisoj_level0
[BUUCTF]PWN8--jarvisoj_level0 题目网址:https://buuoj.cn/challenges#jarvisoj_level0 步骤: 例行检查,64位,开启了NX保护 ...