Java后端⼩程序⽀付demo(⽹上说的坑⾥⾯基本上都有)
Java 后端⼩程序⽀付
⼀、遇到的问题
1. 商户号该产品权限未开通,请前往商户平台>产品中⼼检查后重试
2.签名错误
3.已经调起统⼀下单接⼝,可以拿到预⽀付ID,但是前端⽀付的时候出现⽀付验证签名失败
⽹上的问题基本上就是这三类下⾯说解决⽅案。
第⼀个问题:商户号的问题,app⽀付与⼩程序⽀付的商户号不同,app内⽀付与开放平台内的商户号绑定,⼩程序⽀付是与公众平台内的商户号绑定。
入门的java游戏小程序第⼆个问题:签名错误,第⼀次签名需要的appid mchid key 分别对应的是⼩程序的appid、公众平台绑定的商户号、以及商户平台的密钥(重要的事情说三遍:商户平台的!商户平台的!商户平台的!)。
这⾥重点说下商户平台的密钥(当时就是因为密钥的问题耽误了不少时间):具体请看图(商户平台--->账户中⼼--->API安全---->设置密钥)
第三个问题:⽀付验证签名失败这个就得需要严格执⾏⼩程序⽀付⽂档中的⽣成签名的规则。参数字段⼤⼩写、顺序⼀定要对(切记,切记,切记)
如果能把以上都注意到了,那基本上没什么问题了。下⾯是我⾃⼰写的demo供⼤家参考,有什么问题可以留⾔。
⼆、demo 事例
1.下载商户的证书(在问题2的截图中已经展⽰下载的位置)放在resources下的cert⽬录下(cert⽬录需要⾃⼰⼿动建)
2.实现的 WXPayConfig接⼝
1package com.ieou.franky.payCentermon;
2
3import com.github.wxpay.sdk.WXPayConfig;
4import org.apachemons.io.IOUtils;
5
6import java.io.ByteArrayInputStream;
7import java.io.InputStream;
8
9public class MiniprogramConfig implements WXPayConfig{
10
11private byte[] certData;
12
13public MiniprogramConfig() throws Exception {
14 InputStream certStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("cert/miniProgram/apiclient_cert.p12"); Data = ByteArray(certStream);
16 certStream.close();
17 }
18
19 @Override
20public String getAppID() {
21return "wx6db448a73f8a6666";
22 } //⼩程序appid
23
24 @Override
25public String getMchID() {
26return "1500669999";
27 } //商户号
28
29/** 商户平台-账户中⼼-API安全中的密钥 */
30 @Override
31public String getKey() {
32return "1add1a30ac87aa77yyy2db72f57a237577777";
33 }
34
35 @Override
36public InputStream getCertStream() {
37return new Data);
38 }
39
40 @Override
41public int getHttpConnectTimeoutMs() {
42return 0;
43 }
44
45 @Override
46public int getHttpReadTimeoutMs() {
47return 0;
48 }
49 }
3.调⽤统⼀下单接⼝并且实现签名
1private Map<String, String> createMiniProgramTradePay(WxpayTradeAppPayModel model,String notifyUrl) throws Exception {
2 MiniprogramConfig config = new MiniprogramConfig();
3
4 WXPay wxpay = new WXPay(config);
5
6 Map<String, String> data = new HashMap<>();
7 data.put("appid",AppID());
8 data.put("mch_id",MchID());
9 data.put("body",Body());
10 data.put("out_trade_no", OutTradeNo());
11 data.put("device_info", "");
12 data.put("fee_type", "CNY");
13 data.put("total_fee", TotalFee());
14 data.put("spbill_create_ip", "127.0.0.1");
15 data.put("notify_url", notifyUrl);
16 data.put("trade_type", "JSAPI");
17 data.put("openid",OpenId());
18// data.put("nonce_str","1add1a30ac87aa2db72f57a2375d8fec");
19 String sign = ateSignature(data, Key());
20 data.put("sign",sign);
21
22 Map<String, String> resp = wxpay.unifiedOrder(data);
23if ("SUCCESS".("return_code"))) {
24//再次签名
25/** 重要的事情说三遍⼩程序⽀付所有的字段必须⼤写驼峰模式严格按照⼩程序⽀付⽂档
26 *pay.weixin.qq/wiki/doc/api/wxa/wxa_api.php?chapter=7_7&index=3#
27 * ******* 我当初就因为timeStamp中S没⼤写弄了3个⼩时 **********
28 * */
29 Map<String, String> reData = new HashMap<>();
30 reData.put("appId", AppID());
31 reData.put("nonceStr", ("nonce_str"));
32 String newPackage = "prepay_id=" + ("prepay_id");
33 reData.put("package", newPackage);
34 reData.put("signType","MD5");
35 reData.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000));
36
37 String newSign = ateSignature(reData, Key());
38 resp.put("paySign",newSign);
39 resp.put("timeStamp", ("timeStamp"));
40return resp;
41 } else {
42throw new ("return_msg"));
43 }
44
45 }
说明:这⾥只是说明⼩程序⽀付与app内⽀付的不同和遇到的问题,有关⾥⾯⽤到的SDK,请看上⼀篇⽂章。到这⼀步java 后端代码就差不多了,前端拿到返回的字段调起⽀付接⼝。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论