@Value("${spring.weChat.mchAppid}")
private String mchAppid;
@Value("${spring.weChat.mchid}")
private String mchid;
@Value("${spring.weChat.key}")
private String key;
@Autowired
private HttpServletRequest req;
@Override
public Map<String, String> wechatPay(String amount, String openid, String name) {
Map<String, String> transferMap = new HashMap<>();
Map<String, String> restmap = null;
try {
KeyStore keyStore = KeyStore.getInstance("PKCS12");
//读取本机存放的PKCS12证书文件
ClassPathResource cl = new ClassPathResource("apiclient_cert.p12");
keyStore.load(cl.getInputStream(), mchid.toCharArray());
SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, mchid.toCharArray()).build();
//指定TLS版本
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
sslcontext, new String[]{"TLSv1"}, null,
SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
//设置httpclient的SSLSocketFactory
CloseableHttpClient httpclient = HttpClients.custom()
.setSSLSocketFactory(sslsf)
.build();
//1.数据
Map<String, String> parm = new HashMap<>();
parm.put("mch_appid", mchAppid); // 公众账号appid
parm.put("mchid", mchid); // 商户号
parm.put("nonce_str", WXPayUtil.generateNonceStr()); // 随机字符串
parm.put("partner_trade_no", new SimpleDateFormat("yyyyMMddhhmmss").format(new Date()) + RandomStringUtils.randomNumeric(3)); // 生成商户订单号
parm.put("openid", openid); // 用户openid
parm.put("check_name", "NO_CHECK"); // 是否验证真实姓名--校验用户姓名选项 OPTION_CHECK
parm.put("re_user_name", ""); //收款用户姓名---check_name设置为FORCE_CHECK或OPTION_CHECK,则必填
parm.put("amount", amount); // 转账金额
parm.put("desc", "企业名称" + name); // 企业付款描述信息
parm.put("spbill_create_ip", IpUtils.getIpAddr(req)); // Ip地址
parm.put("sign", WXPayUtil.generateSignature(parm, key));
String str = WXPayUtil.mapToXml(parm);
//2.发送请求
HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers");
httpPost.setEntity(new StringEntity(str, Consts.UTF_8));
logger.info(str);
CloseableHttpResponse execute = httpclient.execute(httpPost);
//3.获取结果
String xmltring = EntityUtils.toString(execute.getEntity(), Consts.UTF_8);
logger.info(xmltring);
restmap = WXPayUtil.xmlToMap(xmltring);
} catch (Exception e) {
e.printStackTrace();
logger.error(e.getMessage(), e);
} finally {
if (CollectionUtil.isNotEmpty(restmap) && "SUCCESS".equals(restmap.get("result_code"))) {
transferMap.put("partner_trade_no", restmap.get("partner_trade_no"));// 商户转账订单号
transferMap.put("payment_no", restmap.get("payment_no")); // 微信订单号
transferMap.put("payment_time", restmap.get("payment_time")); // 微信支付成功时间
transferMap.put("code", "200");
transferMap.put("msg", "提现成功!");
} else {
if (CollectionUtil.isNotEmpty(restmap)) {
transferMap.put("partner_trade_no", restmap.get("partner_trade_no"));// 商户转账订单号
transferMap.put("payment_no", restmap.get("payment_no")); // 微信订单号
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String format = sdf.format(date);
transferMap.put("payment_time", format); // 微信支付成功时间
transferMap.put("code", "500");
transferMap.put("msg", restmap.get("err_code_des"));
}
}
}
return transferMap;
}
WXPayUtil的maven坐标是
<!--微信支付工具包-->
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>
这个文件也不能忘了,放在resource下或者其他文件夹里