赞
踩
**
用户进入小程序,选择商品服务,确认下单;
小程序前台将用户的请求以及用户信息(openid),提交到小程序后台;
小程序后台生成预订单,调用微信支付的统一下单接口,将小程序的预订单提交到微信支付;
通过返回的return_code字段,判断提交成功后,获取微信支付返回的成功信息即预付单信息,包括prepay_id;
将微信返回的预付单信息,加上其他必要信息,签名后,返回给前端用于拉起微信收银台,完成支付。
根据小程序后台提交预订单到微信后台时所提交的通知地址,或小程序主动调用微信支付接口,可查询支付结果。
前提参数:
//小程序appid
private String appid;
//小程序关联的商户号
private String partner;
//商户号的秘钥
private String partnerkey;在这里插入代码片
//1.参数封装 Map param=new HashMap(); //公众账号ID param.put("appid", appid); //商户号 param.put("mch_id", partner); //随机字符串 param.put("nonce_str", WXPayUtil.generateNonceStr()); param.put("body", "芬达"); //交易订单号 param.put("out_trade_no", outTradeNo); //金额(分) param.put("total_fee", totalFee); param.put("spbill_create_ip", "127.0.0.1"); param.put("notify_url", "https://www.baidu.com"); //交易类型 param.put("trade_type", "JSAPI"); //用户标示 param.put("openid", openid);
至关重要的签名,在封装参数的最后一步进行,根据微信官方提供的工具类WXPayUtil可以实现;
String xmlParam = WXPayUtil.generateSignedXml(param, partnerkey);
System.out.println("请求的参数:"+xmlParam);
调用微信接口,需要传xml格式的参数,可以使用**WXPayUtil.generateSignedXml(param, partnerkey)**方法将HashMap类型的参数转换为xml类型,顺便将传入的参数按,秘钥加密封装进一个签名,调用该方法得出的参数就是带有签名的xml类型参数了。
直接调用该方法获得请求数据后,调用接口获得结果,这里我用的是一个HttpClient工具类,方便发送https请求,网上随处可以找到。
//2.发送请求
HttpClient httpClient=new HttpClient("https://api.mch.weixin.qq.com/pay/unifiedorder");
httpClient.setHttps(true);
httpClient.setXmlParam(xmlParam);
httpClient.post();
//3.获取结果
String xmlResult = httpClient.getContent();
Map<String, String> mapResult = WXPayUtil.xmlToMap(xmlResult);
System.out.println("微信返回结果"+mapResult);
PS:字段名最好到官方API 复制以免出错
必要的五个参数,除了随机字符串,和签名外其他都可自行获得。随机字符串推荐用微信工具类**WXPayUtil.generateNonceStr()**获得随机字符串。
签名的获得: · 签名的获得可以根据官方签名规则,自己去手动加密获得签名。 . 根据WXPayUtil工具类去加密WXPayUtil.generateSignature(repData,partnerkey),此方法就是对Map类型的参数repData,用partnerKey进行签名,并返回签名。
获得签名的注意事项
通过工具类获得签名时,有且只需五个参数,且要注意:
//返回前端数据 if (mapResult.get("return_code").equals("SUCCESS")){ //返回给APP端的参数,APP端再调起支付接口 Map<String,String> repData = new HashMap<>(); //注意参数要区分大小写 repData.put("appId",appid); //repData.put("prepayid",mapResult.get("prepay_id")); String packag="prepay_id="+mapResult.get("prepay_id"); repData.put("package",packag); //要添加签名方式 repData.put("signType","MD5"); repData.put("nonceStr",WXPayUtil.generateNonceStr()); repData.put("timeStamp",String.valueOf(System.currentTimeMillis()/1000)); //签名 String sign = WXPayUtil.generateSignature(repData,partnerkey); repData.put("prepayid",mapResult.get("prepay_id")); repData.put("mch_id",partner); repData.put("sign",sign); repData.put("timestamp",repData.get("timeStamp")); return repData;
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>
/** * 创建预订单信息,发起支付 */ @Override public Map createNative(String outTradeNo, String totalFee ,String openid) { //1.参数封装 Map param=new HashMap(); //公众账号ID param.put("appid", appid); //商户号 param.put("mch_id", partner); //随机字符串 param.put("nonce_str", WXPayUtil.generateNonceStr()); param.put("body", "芬达"); //交易订单号 param.put("out_trade_no", outTradeNo); //金额(分) param.put("total_fee", totalFee); param.put("spbill_create_ip", "127.0.0.1"); param.put("notify_url", "https://www.baidu.com"); //交易类型 param.put("trade_type", "JSAPI"); //用户标示 param.put("openid", openid); try { String xmlParam = WXPayUtil.generateSignedXml(param, partnerkey); System.out.println("请求的参数:"+xmlParam); //2.发送请求 HttpClient httpClient=new HttpClient("https://api.mch.weixin.qq.com/pay/unifiedorder"); httpClient.setHttps(true); httpClient.setXmlParam(xmlParam); httpClient.post(); //3.获取结果 String xmlResult = httpClient.getContent(); Map<String, String> mapResult = WXPayUtil.xmlToMap(xmlResult); System.out.println("微信返回结果"+mapResult); //返回前端数据 if (mapResult.get("return_code").equals("SUCCESS")){ //返回给APP端的参数,APP端再调起支付接口 Map<String,String> repData = new HashMap<>(); repData.put("appId",appid); String packag="prepay_id="+mapResult.get("prepay_id"); repData.put("package",packag); repData.put("signType","MD5"); repData.put("nonceStr",WXPayUtil.generateNonceStr()); repData.put("timeStamp",String.valueOf(System.currentTimeMillis()/1000)); //签名 String sign = WXPayUtil.generateSignature(repData,partnerkey); repData.put("prepayid",mapResult.get("prepay_id")); repData.put("mch_id",partner); repData.put("sign",sign); repData.put("timestamp",repData.get("timeStamp")); return repData; } } catch (Exception e) { e.printStackTrace(); } return new HashMap(); }
前端示例代码
wx.requestPayment(
{
'timeStamp': '',
'nonceStr': '',
'package': '',
'signType': 'MD5',
'paySign': '',
'success':function(res){},
'fail':function(res){},
'complete':function(res){}
})
**
感谢大佬分享 如有侵权联系删除
**
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。