环境准备
- 企业版的小程序,这里获取小程序的appId和appSecret。
- 小程序开通微信支付,这里涉及到商户号,将商户号和微信绑定。
下单URL地址:https://api.mch.weixin.qq.com/pay/unifiedorder
部分参数如下:
加入依赖
<!-- 微信支付生成随机字符序列的依赖-->
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>
<!--微信支付相关的微信官方的依赖-->
<dependency>
<groupId>com.github.wechatpay-apiv3</groupId>
<artifactId>wechatpay-apache-httpclient</artifactId>
<version>0.4.8</version>
</dependency>
项目中我们需要自己创建自己后台的订单表。这里只是展示调用微信官方的demo,具体的业务逻辑以及各种参数的校验需要自己根据项目需要自行完善。
//生成一个时间戳
String timeStamp = System.currentTimeMillis()+"";
//利用微信的工具类生成一个随机字符串
String nonce_str = WXPayUtil.generateNonceStr();
//https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
//利用map封装参数
TreeMap<String, String> map = new TreeMap<>();
map.put("appid", WechatConfig.APPID);
map.put("mch_id", (WechatConfig.MCH_ID));
map.put("nonce_str",nonce_str );
map.put("timeStamp",timeStamp);
//生成签名,根据这三个参数生成签名
String sign = WeChatUtils.createSign(map,WechatConfig.MCH_KEY);
// map.put("sign", sign);
map.put("sign_type", "MD5");
map.put("body", orderDO.getDescribe());
map.put("out_trade_no", orderDO.getCode());
map.put("total_fee", WechatUtil.getPrice(orderDO.getRealPrice())+"");
map.put("spbill_create_ip", WeChatUtils.getRealIp(request));
//这个是支付回调的地址,我们可以在回调地址里面对用户下单的行为进行一系列的操作
map.put("notify_url", WechatConfig.NOTIFY_URL);
//这个参数文档里面有说明
map.put("trade_type", "JSAPI");
//这个是下单用户的openId
map.put("openid",orderDO.getOpenId());
HashMap<String,String> mmp = new HashMap<>(map);
map.put("sign",sign);
// String signedXml = WXPayUtil.generateSignedXml(map,WechatConfig.MCH_KEY);
//封装成xml格式
String signedXml = WXPayUtil.generateSignedXml(mmp,WechatConfig.MCH_KEY);
//调用工具类发起请求
WxHttpClient httpClient = new WxHttpClient(url);
httpClient.setHttps(true);
httpClient.setXmlParam(signedXml);
httpClient.post();
//获得结果
String content = httpClient.getContent();
//将xml结果转化成map
Map<String, String> xmlToMap = WXPayUtil.xmlToMap(content);
//这里判断请求是否成功
if ("SUCCESS".equals(xmlToMap.get("return_code"))&&"SUCCESS".equals(xmlToMap.get("result_code"))){
//从这块代码可以看出我们只用到了返回值里面的prepay_id,其他的都是自己生成的,返回值里面的其他参数都没有用,这个微信的官方文档没有说明白,研究了半天
HashMap<String,String> hashMap = new HashMap<>();
hashMap.put("appId",WechatConfig.APPID);
hashMap.put("timeStamp",timeStamp);
hashMap.put("nonceStr",WXPayUtil.generateNonceStr());
hashMap.put("signType","MD5");
hashMap.put("package","prepay_id="+xmlToMap.get("prepay_id"));
hashMap.put("paySign",WXPayUtil.generateSignature(hashMap,WechatConfig.MCH_KEY, WXPayConstants.SignType.MD5));
//前端根据我返回的这些参数足够调起微信的支付页面发起支付了.
return success(hashMap);
}
工具类WxHttpClient
import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity
文章评论