微信支付
开发流程:
下单成功(预扣库存 wq)之后,把订单号返回前端,前端发送支付请求到后端,支付接口把订单号,应付金额传给微信支付系统,微信支付系统返回支付链接,我们把支付连接返回前端,前端通过一个插件展示成二维码,用户扫二维码支付,如果支付成功,微信支付系统会异步回调我们写的接口,我们可以主动查询订单的支付情况,如果支付成功,修改订单状态为已支付,同时插入流水,还要异步通知(websocket)客户端,前端页面跳转支付成功页面
1.下单接口,2.支付接口,3.支付成功给微信回调接口
统一下单接口调用
在线微信支付开发文档:https://pay.weixin.qq.com/wiki/doc/api/index.html
1.导入依赖
第一步:pom依赖
<dependency> <groupId>com.github.tedzhdz</groupId> <artifactId>wxpay-sdk</artifactId> <version>3.0.10</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency>
如果时springboot
<dependency> <groupId>com.github.tedzhdz</groupId> <artifactId>wxpay-sdk</artifactId> <version>3.0.10</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> </exclusion> </exclusions> </dependency>
2.微信支付配置类
package com.fzy.wx; import com.github.wxpay.sdk.IWXPayDomain; import com.github.wxpay.sdk.WXPayConfig; import java.io.InputStream; //微信支付配置类 public class WXConfig extends WXPayConfig { public String getAppID() { return "wx632c8f211f8122c6"; } public String getMchID() { return "1497984412"; } public String getKey() { return "sbNCm1JnevqI36LrEaxFwcaT0hkGxFnC"; } public InputStream getCertStream() { return null; } public IWXPayDomain getWXPayDomain() { return new IWXPayDomain() { public void report(String s, long l, Exception e) { } public DomainInfo getDomain(WXPayConfig wxPayConfig) { return new DomainInfo("api.mch.weixin.qq.com",true); } }; } }
3.测试统一下单接口
步骤:
1:构建配置对象
2:封装请求参数
3:map转xml
4:发送请求WXPayRequest request = new WXPayRequest(config);
5:响应结果转map集合
6:获取支付地址
package com.fzy.wx; import com.github.wxpay.sdk.WXPayRequest; import com.github.wxpay.sdk.WXPayUtil; import java.util.HashMap; import java.util.Map; import java.util.UUID; public class WxDemo { //统一下单接口 public static void main(String[] args) throws Exception{ WXConfig wxConfig = new WXConfig(); //封装请求参数 Map requestParamsMap = new HashMap(); requestParamsMap.put("appid",wxConfig.getAppID()); requestParamsMap.put("mch_id",wxConfig.getMchID()); requestParamsMap.put("nonce_str", WXPayUtil.generateNonceStr()); requestParamsMap.put("body","用户下单支付"); requestParamsMap.put("out_trade_no", "1000000011"); requestParamsMap.put("total_fee",88+""); requestParamsMap.put("spbill_create_ip","127.0.0.1"); requestParamsMap.put("notify_url","http://www.baidu.com"); requestParamsMap.put("trade_type","NATIVE "); //map转成xml String requestParamsXML = WXPayUtil.generateSignedXml(requestParamsMap, wxConfig.getKey()); //发送请求(httpclient) WXPayRequest wxPayRequest = new WXPayRequest(wxConfig); String responseXML = wxPayRequest.requestWithoutCert("/pay/unifiedorder", UUID.randomUUID().toString(), requestParamsXML, false); System.out.println("responseXML = " + responseXML); //解析xml xml => map Map<String,String> responseMap = WXPayUtil.xmlToMap(responseXML); String code_url = responseMap.get("code_url"); System.out.println("code_url = " + code_url); } }
支付接口
@Override
public ResultVO pay(String orderSn, String userid){
//1.查询订单
OmsOrder orderBySn = orderMapper.findOrderBySn(orderSn,userid);
if (orderBySn == null) {
return new ResuLtVO( false,"订单不存在");
}
//判断订单支付状态
if(!"0".equals(orderBySn.getStatus()+"")){
return new ResuLtVO( false, "订单状态必须时待付款");
}
//计算订单的支付金额
BigDecimal payAmount = orderBySn.getPayAmount();
BigDecimal payAmountFen = payAmount.multiply(new BigDecimal( "100"));
//调用微信的统一下单接口
try {
String codeUrl = wxpay(orderSn, payAmountFen.toString(),"http://www.baidu.com");
return new ResuLtVO( true, "下单成功" , codeUrl);
} catch (Exception e) {
e.printStackTrace();
return new ResuLtVO( false, "下单失败");
}
//微信的统一下单接口
@Override
public String wxpay(String orderSn, String fee, String notifyUrl){
WXConfig wxConfig = new WXConfig();
//封装请求参数
Map requestParamsMap = new HashMap();
requestParamsMap.put("appid",wxConfig.getAppID());
requestParamsMap.put("mch_id",wxConfig.getMchID());
requestParamsMap.put("nonce_str", WXPayUtil.generateNonceStr());
requestParamsMap.put("body","用户下单支付");
requestParamsMap.put("out_trade_no", orderSn);
requestParamsMap.put("total_fee",fee+"");
requestParamsMap.put("spbill_create_ip","127.0.0.1");
requestParamsMap.put("notify_url",notifyUrl);
requestParamsMap.put("trade_type","NATIVE ");
//map转成xml
String requestParamsXML = WXPayUtil.generateSignedXml(requestParamsMap, wxConfig.getKey());
//发送请求(httpclient)
WXPayRequest wxPayRequest = new WXPayRequest(wxConfig);
String responseXML = wxPayRequest.requestWithoutCert("/pay/unifiedorder", UUID.randomUUID().toString(), requestParamsXML, false);
System.out.println("responseXML = " + responseXML);
//解析xml xml => map
Map<String,String> responseMap = WXPayUtil.xmlToMap(responseXML);
String code_url = responseMap.get("code_url");
System.out.println("code_url = " + code_url);
return code_url;
}