微信的官方文档在绝大多情况下是非常有用的,可是漏洞也不少,这就让我碰到了一个。
第一步:获取openid。
第二步,也就是统一下单接口,在做这一步前,你必须确保你的商户号已经授权小程序appid,并且开通了微信支付功能,然后为了确保成功,你最好重置一下商户平台-api密钥,好了,至此为止微信小程序开发工具上的东西你都配置齐了,可是成了吗?没有,为啥他还是反复的报:
商户号该产品权限未开通,请前往商户平台>产品中心检查后重试
在多次测试后我开通了微信商户平台-产品中心-JSAPI支付,终于解决了这个问题,可当我回头去确认文档,发现官方根本没有提到小程序需要开通这个功能~
源码
一.微信wxml页面代码
<button class='submit' bindtap='sub'>提交订单(微信支付)</button>
二.微信js页面代码
调起支付框
sub: function() {
wx.request({
url: 'http://localhost:8070/test/wxPayTest',
method: "post",
success: res => {
console.log(res.data)
wx.requestPayment({
nonceStr: res.data.nonceStr,
package: res.data.package,
paySign: res.data.paySign,
signType: 'MD5',
timeStamp: res.data.timeStamp,
success(res) {
console.log(res.data);
wx.request({
url: 'http://localhost:8070/test/wxPayY',
method: "post",
success: res => {
console.log(res);
wx.showModal({
title: '提示',
content: '支付成功',
showCancel: false,
})
}
})
},
fail(res) {
wx.showModal({
title: '提示',
content: '支付失败',
showCancel: false,
})
},
})
},
})
}
三.java后台
pom.xml引入
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
MiniprogramConfig
package com.kx.wechatprinting.util;
import com.github.wxpay.sdk.WXPayConfig;
import org.apache.commons.io.IOUtils;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
public class MiniprogramConfig implements WXPayConfig {
private byte[] certData;
public MiniprogramConfig() throws Exception {
// InputStream certStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("cert/miniProgram/apiclient_cert.p12");
// System.out.println(certStream);
// this.certData = IOUtils.toByteArray(certStream);
// certStream.close();
}
@Override
public String getAppID() {
return "wx4597cf6e16321fcd";
} //小程序appid
@Override
public String getMchID() {
return "1543743162";
} //商户号
/** 商户平台-账户中心-API安全中的密钥 */
@Override
public String getKey() {
return "106573123124124sdasdasda213sd";
}
@Override
public InputStream getCertStream() {
return new ByteArrayInputStream(this.certData);
}
@Override
public int getHttpConnectTimeoutMs() {
return 0;
}
@Override
public int getHttpReadTimeoutMs() {
return 0;
}
}
Testcontroller
@RequestMapping("/wxPayTest")
@ResponseBody
private Map<String, String> createMiniProgramTradePay() throws Exception {
MiniprogramConfig config = new MiniprogramConfig();
WXPay wxpay = new WXPay(config);
long indentCode=new Date().getTime();
Map<String, String> data = new HashMap<>();
data.put("appid",config.getAppID());
data.put("mch_id",config.getMchID());
data.put("body","支付测试");
data.put("out_trade_no", indentCode+"");//最好按微信文档来,时间戳加随机序列
data.put("device_info", "");
data.put("fee_type", "CNY");
data.put("total_fee", "1");//1分钱测试
data.put("spbill_create_ip", "192.168.1.232");
data.put("notify_url", "https://segmentfault.com/a/1190000014460305");//先随便填一个线上地址
data.put("trade_type", "JSAPI");//这个不能变
data.put("openid","asdqweqweqweqweqqwe");
String nonce_str = WXPayUtil.generateNonceStr();
data.put("nonce_str",nonce_str);
String sign = WXPayUtil.generateSignature(data, config.getKey());
System.out.println(sign);
data.put("sign",sign);
System.out.println(data);
Map<String, String> resp = wxpay.unifiedOrder(data);
System.out.println(resp);
if ("SUCCESS".equals(resp.get("return_code"))) {
//再次签名
* */
Map<String, String> reData = new HashMap<>();
reData.put("appId", config.getAppID());
reData.put("nonceStr", resp.get("nonce_str"));
String newPackage = "prepay_id=" + resp.get("prepay_id");
reData.put("package", newPackage);
reData.put("signType","MD5");
reData.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000));
String newSign = WXPayUtil.generateSignature(reData, config.getKey());
resp.put("paySign",newSign);
resp.put("timeStamp", reData.get("timeStamp"));
return resp;
} else {
throw new Exception(resp.get("return_msg"));
}
}
参考文档:https://www.2cto.com/kf/201804/735412.html
好了,到这里就可以拉起支付并付钱了