一次性解决微信支付-JSAPI支付问题(想把微信支付JSAPI文档撰写者按在地上摩擦)
最近一个项目需要接入微信支付,所以在现有的项目中接入这个功能,但是最终发现,微信支付是个大坑,至少我认为微信支付文档的撰写者应该是小学水平,又或者是幼儿园水平,写文档的能力简直无语,很多关键性的细节居然是概括或者全局描述,一个简单的支付校验,整整花去我一天时间,真的是怀疑了自己的智商。
至于说怎么解决的,是因为我终于看到两字”假如“,原来参数举例是不对的,只是打了个比方,参数格式也不是蛇形的,也只是打了个比方,这个时候,真的想把微信支付的文档撰写者按在地上摩擦,以下是截图证据:
好了废话不多说了,下面开始说明:
一、准备工作:
1、微信公众号,appid和appsecret(这里不做赘述,相信大家都没有问题)
2、商户号,mchId,证书,申请授权目录,申请商户API密钥(基本没有问题,如果有问题,给我留言,我来补上)
3、下载微信支付JSAPI的demo,地址是https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1,下载完了以后不能直接使用,因为按照sdk中的readme,是无法正常使用的(对的,这个就是微信的sdk和demo,就是这么神奇,官方出的也不能用)。
二、下面是对这些不完整进行修改的地方修改如下:
1、WXPayConfig.java文件,所有的abstract前加上public,其中有一个处理doMain的需要具体实现,如下:
/*** 获取WXPayDomain, 用于多域名容灾自动切换** @return*/
abstract IWXPayDomain getWXPayDomain();
改成
/*** 获取WXPayDomain, 用于多域名容灾自动切换** @return*/
public IWXPayDomain getWXPayDomain() {IWXPayDomain iwxPayDomain = new IWXPayDomain() {public void report(String domain, long elapsedTimeMillis, Exception ex) {}public DomainInfo getDomain(WXPayConfig config) {return new IWXPayDomain.DomainInfo(WXPayConstants.DOMAIN_API, true);}};return iwxPayDomain;
}
2、然后编译成jar包,在引用的过程,需要创建一个WXConfig.java,复制下面代码:
import com.github.wxpay.sdk.IWXPayDomain;
import com.github.wxpay.sdk.WXPayConfig;
import com.github.wxpay.sdk.WXPayConstants;import java.io.*;
public class WXConfig extends WXPayConfig {private byte[] certData;public WXConfig() throws Exception {//此处是微信支付安全证书存放的位置,证书需自行下载//下载地址:登录微信商户平台-账户中心-API安全-API证书//动态读取安全证书写法可参考我的另一篇文章://https://blog.csdn.net/qq_36928715/article/details/104656618
// String certPath = "F:/cert/apiclient_cert.p12";String certPath = "/data/cert/apiclient_cert.p12";File file = new File(certPath);InputStream certStream = new FileInputStream(file);this.certData = new byte[(int) file.length()];certStream.read(this.certData);certStream.close();}//微信公众号appidpublic String getAppID() {return "wx2323423423423423";}//商户号public String getMchID() {return "160923423423";}public String getKey() {return "GHJs34223423423423423423423";//32位商户api密钥}public InputStream getCertStream() {ByteArrayInputStream certBis = new ByteArrayInputStream(this.certData);return certBis;}public int getHttpConnectTimeoutMs() {return 8000;}public int getHttpReadTimeoutMs() {return 10000;}}
3、然后统一下单,且计算paySign,paySign签名的值是appId,nonceStr,timeStamp,package四个参数(跟官方文档提的那个一毛线关系都没有,因为他写了个假如,所以他也没说是真的,就让你自己猜吧,加密方式必须是MD5,不要问为什么,官方就是这么high),尽量调用微信sdk内置的签名方法,代码如下:
WXConfig config = new WXConfig();
WXPay wxpay = new WXPay(config);Map<String, String> data = new HashMap<String, String>();
data.put("body", "腾讯充值中心-QQ会员充值");
data.put("out_trade_no", "2016090910595900000012");
data.put("device_info", "WEB");
data.put("fee_type", "CNY");
data.put("total_fee", "1");
data.put("spbill_create_ip", "123.12.12.123");
data.put("notify_url", "http://www.example.com/wxpay/notify");
data.put("trade_type", "JSAPI");
data.put("product_id", "12");
data.put("openid", "dhajkgdhjaghj13267816381");
data.put("sign_type", "MD5");Map<String, String> resp = wxpay.unifiedOrder(data);
//后端生成paySign给前端,放置签名失败
Date date=new Date();
String sec=String.valueOf(date.getTime()/1000);
Map map = new HashMap();
map.put("appId", config.getAppID());// 公众号id
map.put("nonceStr",resp.get("nonce_str"));// 随机字符串
map.put("timeStamp",sec);
map.put("package", "prepay_id="+resp.get("prepay_id"));
map.put("signType", "MD5");
String sign = WXPayUtil.generateSignature(map,config.getKey());
map.put("paySign", sign);
4、前端调用:
WeixinJSBridge.invoke('getBrandWCPayRequest', {"appId": wxObj.appid,//公众号ID,由商户传入"timeStamp": wxObj.timeStamp,//不要自己生成,取后端传回的"nonceStr": wxObj.nonceStr, //不要自己生成,取后端传回的随机串"package": "prepay_id=" + wxObj.prepayId,//预付订单"signType": "MD5",//微信签名方式:"paySign": wxObj.signType //不要自己生成,取后端传回的微信签名 },function (res) {if (res.err_msg == "get_brand_wcpay_request:ok") {// 使用以上方式判断前端返回,微信团队郑重提示://res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。console.log(res);}
});
5、到此就OK了。下面我会把修好的sdk和调用的代码上传,提供下载:
微信支付JSAPI支付修改版本wxpay-sdk-3.0.9
一次性解决微信支付-JSAPI支付问题(想把微信支付JSAPI文档撰写者按在地上摩擦)相关推荐
- 解决Adobe Arcobat Reader DC打开PDF提示:正在准备文档以供阅读,请稍后
解决Adobe Arcobat Reader DC打开PDF提示:正在准备文档以供阅读,请稍后 解决Adobe Arcobat Reader DC打开PDF提示:正在准备文档以供阅读,请稍后 问题描述 ...
- 解决pdf不能打印,不能注释,不能修改,不能保存等文档限制
解决pdf不能打印,不能注释,不能修改,不能保存等文档限制 pdf下载的文件可能保存不完整,305页的只下载了298页,阅读的宝贵批注因为文档不完整而无法保存,出现109等号错误 PDF"文 ...
- 解决《获取My Document目录错误,可能”我的文档“目录不存在》
打开安装好的程序会出现下面的错误 解决<获取My Document目录错误,可能"我的文档"目录不存在> 方法:开始-运行-搜索regedit.exe打开注册表 依次打 ...
- 多闪:我真没有和微信杠,我只是想“颠覆”微信
后台回复[领取资源],领取公众号福利! 最近,字节跳动发布了一款新的产品,一个主打年轻用户的视频社交软件,它就是多闪. 这款APP目前好像只能用抖音的帐号登录,并且和抖音的私信聊天互通,说白了就是把抖 ...
- 想要打印大量Word文档在哪里打印比较便宜
如果您想要打印大量的Word文档的话,您会选择在哪里打印呢?是选择在线下打印复印店,还是线上打印复印店呢?一般大批量打印文件,小编推荐大家可以到线上打印平台去打印.选择线上打印要比线下打印的价格低,而 ...
- 我只是想使用一下微软在线文档
因为在Linux上作开发,想使用微软提供的在线Office: https://products.office.com/zh-cn/office-online/documents-spreadsheet ...
- 微信小程序(原生):基本开发相关文档
1.微信公众平台(后台登录页): https://mp.weixin.qq.com/ 2.微信小程序官网文档(组件+api等): https://developers.weixin.qq.com/mi ...
- C# 淘宝商品微信返利助手开发-(二)返利助手开放文档以及帐号申请地址
系列教程一目录:返利助手原理 系列教程二目录:返利助手开放文档以及帐号申请地址 系列教程三目录:返利助手开发(1)API介绍 系列教程四目录:返利助手开发(2)淘宝分享的内容如何只取淘口令 系列教程五 ...
- 基于云开发的微信答题活动小程序v1.0搭建部署帮助文档
11月是全国"119"消防宣传月,不少企事业单位都会举办消防安全知识竞答活动,因此我基于云开发搭建了消防安全知识答题活动小程序. 接着,还写完了初阶的手把手教你搭建答题活动小程序系 ...
最新文章
- 从1G到5G,从回顾过去到展望未来
- 《你的灯亮着吗》读书笔记1
- 卷积神经网络CNN总结
- 开源的库RestSharp轻松消费Restful Service
- python2转python3代码_Python2代码转成Python3代码
- 漫话:如何给女朋友解释为什么Java线程没有Running状态?
- Linux下最快速共享目录的方法
- 安装centos linux7,安装centos7
- 许怡然:网游创业失败全攻略
- 机器学习梯度消失,梯度爆炸原因
- Java面向对象编程(五)特殊类
- [UE4]让Spline具象化
- 应聘高薪工作,怎样写简历?
- gps wifi信号测试软件,搜星+WiFi+EMI 导航平板信号性能横评
- 银河麒麟高级服务器部署glusterfs
- 给一个字符类型的数组chas和一个整数size,请把大小为size的左半区整体右移到右半区,右半区整体移动到左边。
- Jupyter notebook 报错 500 : Internal Server Error的解决方法
- 计算机的优缺点英语作文100词,英语作文 电脑的优点和缺点_900字_英语作文
- 明源笔试题目--将一个正整数分解质因数
- Easy Mock 的使用
热门文章
- Synopsys license
- 谁都可以做-几分钱打造完美DIY面膜 - 健康程序员,至尚生活!
- 土地变更调查 名词解释
- 全网最齐全的《大数据选择题题库.pdf》限时开放下载!
- 为什么全世界都要鼓励青少儿学习编程?
- 2018最新大数据职业划分和薪资介绍(大数据从事者须知)
- 一打开控制台窗口就中文输入_Lightconverse灯光设计软件中文电子文档教程免费分享...
- Neo4j -CQL的基本使用(新手快速入门)
- DRiV Incorporated 在今年晚些时候将从 Tenneco 脱离
- 2021年安全员-A证考试及安全员-A证考试资料