m.put(“trade_type”, “NATIVE”);
//trade_type=NATIVE时,此参数必传
m.put(“product_id”, order.getId());
//生成签名
m.put(“sign”, WXPayUtil.generateSignature(m, OrderUtils.APP_KEY));
//发送请求,请求路径:UNIFIED_ORDER_URL = “https://api.mch.weixin.qq.com/pay/unifiedorder”
HttpClient client = new HttpClient(OrderUtils.UNIFIED_ORDER_URL);
//设置xml格式的参数,要把map转为xml
client.setXmlParam(WXPayUtil.mapToXml(m));
//设置支持https
client.setHttps(true);
//执行请求发送
client.post();
//xml转为map接受结果
Map<String, String> response = WXPayUtil.xmlToMap(client.getContent());
long end = System.currentTimeMillis();
System.out.println(“请求https://api.mch.weixin.qq.com/pay/unifiedorder耗时:” + (end - begin) + “ms”);
System.out.println(“请求结果:” + JSON.toJSONString(response));
if (“SUCCESS”.equals(response.get(“return_code”)) && “SUCCESS”.equals(response.get(“result_code”))) {
Map<String, String> param = new HashMap<>();
//二维码地址
param.put(“code_url”, response.get(“code_url”));
param.put(“order_sn”, order.getOrderSn());
param.put(“order_id”, order.getId());
param.put(“total_fee”, order.getActualPrice().multiply(new BigDecimal(“100”)).longValue() + “”);
return param;
}
//为空代表下单失败
return null;
}
上面代码中最重要的返回结果就是code_url。即生成的支付二维码地址,然后用微信扫码并付款即可。
4.APP统一下单
应用场景是APP端调用微信支付,对接uniapp开发的app
归纳如下:
appid | APP的app_id |
mch_id | 商户号 |
nonce_str | 随机字符串,可以调用 WXPayUtil下 generateNonceStr方法生成 |
sign | 可以调用 WXPayUtil下 generateSignature方法生成,这个方法需要用到准备工作中的商户API密钥(APP_KEY)来加密。 |
body | 商品描述,建议软件名字+产品操作,例如天天爱消除-游戏充值 |
out_trade_no | 我们自己生成的订单号,保证同一商号下唯一即可 |
total_fee | 金额,注意单位是分 |
spbill_create_ip | 用户客户端ip |
notify_url | 支付结果通知回调地址 |
trade_type | 交易类型,我们这里填APP |
但是下完单之后,怎么样才能让前端调用微信支付呢?这里需要查看uniapp 官方文档 微信小程序支付:
我们可以看到常规的比如 appid、商户号 需要,充要的是预支付id prepayid和签名 。
代码实现如下:
public Map<String, String> unifiedOrderByApp(Order order, String clientIp) throws Exception {
long begin = System.currentTimeMillis();
//使用map封装微信支付需要的固定参数
Map<String, String> m = new HashMap<>();
//1、设置支付参数
m.put(“appid”, OrderUtils.APP_APP_ID);
m.put(“mch_id”, OrderUtils.MCH_ID);
m.put(“nonce_str”, WXPayUtil.generateNonceStr());
//商品描述 例如:天天爱消除-游戏充值
m.put(“body”, “换芯易-” + order.getGoodsModel() + “购买”);
//订单号
m.put(“out_trade_no”, order.getOrderSn());
m.put(“total_fee”, order.getActualPrice().multiply(new BigDecimal(“100”)).longValue() + “”);
m.put(“spbill_create_ip”, clientIp);
m.put(“notify_url”, OrderUtils.NOTIFY_URL);
m.put(“trade_type”, “APP”);
//生成签名
m.put(“sign”, WXPayUtil.generateSignature(m, OrderUtils.APP_KEY));
//发送请求,请求路径:UNIFIED_ORDER_URL = “https://api.mch.weixin.qq.com/pay/unifiedorder”
HttpClient client = new HttpClient(OrderUtils.UNIFIED_ORDER_URL);
//设置xml格式的参数,要把map转为xml
client.setXmlParam(WXPayUtil.mapToXml(m));
//设置支持https
client.setHttps(true);
//执行请求发送
client.post();
//xml转为map接受结果
Map<String, String> response = WXPayUtil.xmlToMap(client.getContent());
long end = System.currentTimeMillis();
System.out.println(“请求htt