Java中换取微信支付唯一订单号(用于换取支付窗口)
/**
* 微信小程序支付
*/
@PostMapping(value = "/xcxPay")
@ResponseBody
public Map<String,Object> miniAppPay(@RequestBody byte[] req) {
HashMap<String, Object> objectObjectMap = new HashMap<>();
JSONObject json = JSONObject.parseObject(new String(req, Charset.forName("UTF-8")));
System.out.println("请求参数"+json);
String ip = "127.0.0.1";
String money = null;
String remark = null;
Map<String, String> params = UnifiedOrderModel
.builder()
.appid(小程序appid)
.mch_id(微信商家商户号)
.nonce_str(WxPayKit.generateStr())
.body(remark)
.attach(remark)
.out_trade_no(订单号)
.total_fee(金额)
.spbill_create_ip(ip)
.notify_url(回调地址)
.trade_type(TradeType.JSAPI.getTradeType())
.openid(小程序openid)
.build()
.createSign(微信官方商户密钥, SignType.HMACSHA256);
String xmlResult = WxPayApi.pushOrder(false, params);
System.out.println(xmlResult);
Map<String, String> result = WxPayKit.xmlToMap(xmlResult);
String returnCode = result.get("return_code");
String returnMsg = result.get("return_msg");
String resultCode = result.get("result_code");
// 以下字段在 return_code 和 result_code 都为 SUCCESS 的时候有返回
String prepayId = result.get("prepay_id");
Map<String, String> packageParams = WxPayKit.miniAppPrepayIdCreateSign(wxspAppid, prepayId,
wxspSecret, SignType.HMACSHA256);
String jsonStr = JSON.toJSONString(packageParams);
System.out.println("小程序支付的参数:" + jsonStr);
objectObjectMap.put("status","0000");
objectObjectMap.put("payMess",packageParams);
return objectObjectMap;
}
支付结果异步通知接口
/**
* 异步通知
* 这里面可以写判断支付成功之后的及具体业务需求
*/
@RequestMapping(value = "/payNotify", method = {RequestMethod.POST, RequestMethod.GET})
@ResponseBody
public String payNotify(HttpServletRequest request) {
System.out.println("支付通知=1" + request);
String xmlMsg = HttpKit.readData(request);
System.out.println("支付通知=" + xmlMsg);
Map<String, String> params = WxPayKit.xmlToMap(xmlMsg);
String returnCode = params.get("return_code");
//通过支付订单号处理业务
String order = params.get("out_trade_no");
System.out.println("支付订单号:"+order);
// 注意重复通知的情况,同一订单号可能收到多次通知,请注意一定先判断订单状态
// 注意此处签名方式需与统一下单的签名类型一致
if (WxPayKit.verifyNotify(params, wxspSecret, SignType.HMACSHA256)) {
if (WxPayKit.codeIsOk(returnCode)) {
// 更新订单信息
//支付成功
// 发送通知等
Map<String, String> xml = new HashMap<String, String>(2);
xml.put("return_code", "SUCCESS");
xml.put("return_msg", "OK");
return WxPayKit.toXml(xml);
}
}
return "success";
}
前端唤起支付窗口
pay(e){
var that = this;
wx.requestPayment({
// "appId":e.appId, //公众号ID,由商户传入
"timeStamp":e.timeStamp, //时间戳,自1970年以来的秒数
"nonceStr":e.nonceStr, //随机串
"package":e.package,
"signType":e.signType, //微信签名方式:
"paySign":e.paySign, //微信签名
success (res) {
//支付成功
},
fail (res) { },
})
},