微信支付模板
一、接口
package com.pinyougou.pay.service;
import java.util.Map;
/**
* 微信支付接口
*/
public interface WeixinPayService {
/**
* 生成支付二维码链接
* @param out_trade_no
* @param total_fee
* @return
*/
public Map createNative(String out_trade_no, String total_fee);
/**
* 查询支付状态:每隔3秒轮询
* @param out_trade_no
* @return
*/
public Map queryPayStatus(String out_trade_no);
/**
* 关闭支付
* @param out_trade_no
* @return
*/
public Map closePay(String out_trade_no);
}
二、实现类
微信开发SDK参照官网;utils.HttpClient详见https://www.jianshu.com/p/fb9b83b61b1f
package com.pinyougou.pay.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.github.wxpay.sdk.WXPayUtil;
import com.pinyougou.pay.service.WeixinPayService;
import org.springframework.beans.factory.annotation.Value;
import utils.HttpClient;
import java.util.HashMap;
import java.util.Map;
/**
* 微信支付
*/
@Service
public class WeixinPayServiceImpl implements WeixinPayService {
/** @Value注解中的值,需要applicationContext-service.xml中配置
<!-- 解析properties包 -->
<context:property-placeholder location="classpath*:properties/*.properties"/>
数据来源于 weixinpay.properties 配置文件
*/
@Value("${appid}")
private String appid;
@Value("${partner}")
private String partner;
@Value("${partnerkey}")
private String partnerKey;
/**
* 生成支付二维码链接
* @param out_trade_no
* @param total_fee
* @return
*/
@Override
public Map createNative(String out_trade_no, String total_fee) {
// 1. 创建参数
Map<String, String> param = new HashMap<>();
// 公众号
param.put("appid", appid);
// 商户号
param.put("mch_id", partner);
// 随机字符串
param.put("nonce_str", WXPayUtil.generateNonceStr());
// 商品描述
param.put("body", "pinyougou");
// 商户订单号
param.put("out_trade_no", out_trade_no);
// 总金额(分)
param.put("total_fee", total_fee);
// IP
param.put("spbill_create_ip", "127.0.0.1");
// 回调地址
param.put("notify_url", "http://www.lingting.com");
// 交易类型
param.put("trade_type", "NATIVE");
try {
// 2. 生成要发送的xml
/*
String xmlParam = WXPayUtil.generateSignedXml(param, partnerKey);
HttpClient client = new HttpClient("https://api.mch.weixin.qq.com/pay/unifiedorder");
client.setHttps(true);
client.setXmlParam(xmlParam);
client.post();
String result = client.getContent();
Map<String, String> resultMap = WXPayUtil.xmlToMap(result);
*/
Map<String, String> resultMap = sendOrderToWeiChat(param, "https://api.mch.weixin.qq.com/pay/unifiedorder");
Map<String, String> map = new HashMap<>();
// 微信返回的信息
map.put("return_msg", resultMap.get("return_msg"));
// 支付地址
map.put("code_url", resultMap.get("code_url"));
// 总金额
map.put("total_fee", total_fee);
// 订单号
map.put("out_trade_no", out_trade_no);
map.putAll(resultMap);
return map;
} catch (Exception e) {
e.printStackTrace();
return new HashMap();
}
}
/**
* 查询支付状态:
* @param out_trade_no
* @return
*/
@Override
public Map queryPayStatus(String out_trade_no) {
Map param = new HashMap();
// 公众账号ID
param.put("appid", appid);
// 商户号
param.put("mch_id", partner);
// 订单号
param.put("out_trade_no", out_trade_no);
// 随机字符串
param.put("nonce_str", WXPayUtil.generateNonceStr());
// 向微信查询订单
return sendOrderToWeiChat(param, "https://api.mch.weixin.qq.com/pay/orderquery");
}
/**
* 关闭支付 告诉微信关闭 订单
* @param out_trade_no
* @return
*/
@Override
public Map closePay(String out_trade_no) {
Map param = new HashMap();
// 公众号ID
param.put("appid", appid);
// 商户号
param.put("mch_id", partner);
// 订单号【需要被关闭的订单号】
param.put("out_trade_no", out_trade_no);
// 随机字符串
param.put("nonce_str", WXPayUtil.generateNonceStr());
// 向微信申请取消订单
return sendOrderToWeiChat(param, "https://api.mch.weixin.qq.com/pay/closeorder");
}
/**
* 向微信发送 订单 查询/取消
* @param param
* @param url
* @return
*/
private Map sendOrderToWeiChat(Map param, String url) {
try {
String xmlParam = WXPayUtil.generateSignedXml(param, partnerKey);
HttpClient client = new HttpClient(url);
client.setHttps(true);
client.setXmlParam(xmlParam);
client.post();
String result = client.getContent();
Map<String, String> map = WXPayUtil.xmlToMap(result);
/* ~~~~~~~~~~~~~~~~~~~~~~ */
System.out.println(xmlParam);
System.out.println(map);
/* ~~~~~~~~~~~~~~~~~~~~~~ */
return map;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}