@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
@Transactional
public Map wechatPay(String amount, String openid, String name) throws Exception {
KeyStore keyStore = KeyStore.getInstance("PKCS12");
//讀取本機存放的PKCS12證書文件
keyStore.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("apiclient_cert.p12"), mchAppid.toCharArray());
SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, mchAppid.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();
Map<Object, Object> map = new HashMap<>();
/**
* 這裏我是原來微信三方登錄時獲取openId存入數據庫的,所有可以直接讀出來
* 根據你的業務邏輯來獲取openId
*/
Map<String, String> restmap = null;
//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));
CloseableHttpResponse execute = httpclient.execute(httpPost);
//3.獲取結果
String xmltring = EntityUtils.toString(execute.getEntity(), Consts.UTF_8);
restmap = WXPayUtil.xmlToMap(xmltring);
if (CollectionUtil.isNotEmpty(restmap) && "SUCCESS".equals(restmap.get("result_code"))) {
Map<String, String> transferMap = new HashMap<>();
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")); // 微信支付成功時間
} else {
if (CollectionUtil.isNotEmpty(restmap)) {
}
}
map.put("code", 200);
map.put("msg", "提現成功!");
return map;
}
WXPayUtil的maven座標是
<!--微信支付工具包-->
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>
這個文件也不能忘了,放在resource下或者其他文件夾裏