1、导入微信支付sdk
<!-- 微信支付sdk包 -->
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>
2、实现微信的WXPayConfig接口
/**
* @author xdy
* @description 微信支付基础配置参数
* @date 2020/12/11
*/
public class WechatPayConfig implements WXPayConfig {
/**
* appId
*/
public static String appId = "wx12xxxx";
/**
* 商户id
*/
public static String mchId = "xxxx064842";
/**
* key
*/
public static String key = "xxxx02862083977";
@Override
public String getAppID() {
return appId;
}
@Override
public String getMchID() {
return mchId;
}
@Override
public String getKey() {
return key;
}
@Override
public InputStream getCertStream() {
return null;
}
@Override
public int getHttpConnectTimeoutMs() {
return 0;
}
@Override
public int getHttpReadTimeoutMs() {
return 0;
}
}
3、统一下单接口
/**
* 统一下单接口
* @param body 订单描述
* @param sub_mch_id 子商户号
* @param openId 用户openid
* @param out_trade_no 订单号
* @param total_fee 下单金额
* @param notify 支付结果通知地址
* 官方文档地址: https://pay.weixin.qq.com/wiki/doc/api/jsapi_sl.php?chapter=9_1
* @return
* @throws Exception
*/
private Map<String,String> pay(String body,String sub_mch_id,String openId,String out_trade_no,String total_fee,String notify,String module_name,String sub_appid,String sub_openid) {
WechatPayConfig payConfig = new WechatPayConfig();
WXPay wxPay = new WXPay(payConfig);
Map<String,String> map = new HashMap<>();
// 子商户号
map.put("sub_mch_id",sub_mch_id);
// 商品描述
map.put("body",body);
// 订单号
map.put("out_trade_no",out_trade_no);
// 总金额
map.put("total_fee",total_fee);
// 终端ip
map.put("spbill_create_ip","");
// 回调地址
map.put("notify_url","http://www.baidu.com");
// 交易类型
map.put("trade_type","JSAPI");
// 用户openid
if (StringUtils.isNotNull(openId)) {
map.put("openid", openId);
}
if (StringUtils.isNotNull(sub_appid) || StringUtils.isNotEmpty(sub_appid)){
map.put("sub_appid",sub_appid);
}
if (StringUtils.isNotNull(sub_openid) || StringUtils.isNotEmpty(sub_openid)) {
map.put("sub_openid", sub_openid);
}
OrderSource orderSource = new OrderSource();
orderSource.setUuid(UUIDUtils.getUUID());
orderSource.setSubject(body);
orderSource.setSubMchId(sub_mch_id);
orderSource.setOutTradeNo(out_trade_no);
orderSource.setTotalAmount(total_fee);
orderSource.setPayType("WECHAT");
orderSource.setNotify(notify);
orderSource.setModuleName(module_name);
orderSource.setOpenId(openId);
orderSource.setSubAppId(sub_appid);
orderSource.setSubAppId(sub_appid);
Map<String,String> resp = new HashMap<>();
try {
logger.info(map.toString());
resp = wxPay.unifiedOrder(map);
orderSource.setReturnValue(resp.toString());
if (resp.get("return_code").equals("SUCCESS")&&resp.get("result_code").equals("SUCCESS")){
resp.put("appId", payConfig.getAppID());
resp.put("timeStamp", String.valueOf(System.currentTimeMillis()/1000));
resp.put("nonceStr", WXPayUtil.generateNonceStr());
resp.put("signType", "MD5");
resp.put("package", "prepay_id=" + resp.get("prepay_id"));
String paySign = WXPayUtil.generateSignature(resp, payConfig.getKey());
resp.put("paySign", paySign);
orderSource.setPayStatus("CREATE");
resp.put("result","SUCCESS");
}else {
orderSource.setPayStatus("CREATE_FAIL");
resp.put("result","FAIL");
}
}catch (Exception e){
e.printStackTrace();
resp.put("result","FAIL");
}
try {
System.out.println("新增订单记录(统一下单):"+DataSourceUtil.executeSql(DataSourceUtil.INSERT_ORDER,orderSource));
}catch (Exception e){
e.printStackTrace();
}
return resp;
}
前端拿到统一下单返回值调用微信发起支付
4、支付回调
/**
* 下单结果通知
* @param request
* @param response
* @throws Exception
*/
@PostMapping("/notify")
public void weixin_notify(HttpServletRequest request, HttpServletResponse response) throws Exception{
//读取参数
InputStream inputStream ;
StringBuffer sb = new StringBuffer();
inputStream = request.getInputStream();
String s ;
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
while ((s = in.readLine()) != null){
sb.append(s);
}
in.close();
inputStream.close();
Map<String,String> map = WXPayUtil.xmlToMap(sb.toString());
logger.debug("统一下单结果通知:"+map.toString());
//判断签名是否正确
String sign = WXPayUtil.generateSignature(map,new WechatPayConfig().getKey(), WXPayConstants.SignType.MD5);
if(sign.equals(map.get("sign"))) {
logger.debug("支付结果通知---签名验证成功》》》");
//处理业务开始--
String resXml = "";
if("SUCCESS".equals(map.get("result_code"))){
//执行自己的业务逻辑
//告诉微信服务器,我收到信息了,不要在调用回调action了
resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"
+ "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";
} else {
//执行自己的业务逻辑
resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>"
+ "<return_msg><![CDATA[报文为空]]></return_msg>" + "</xml> ";
}
BufferedOutputStream out = new BufferedOutputStream(
response.getOutputStream());
out.write(resXml.getBytes());
out.flush();
out.close();
} else{
logger.debug("通知签名验证失败");
}
}
完整的微信支付差不多就是这样了…