springboot集成微信支付服务商版之付款码支付
一、说明:
通过引入依赖实现微信支付,是非常方便的;
但是官方的SDK没有服务商版,以下是在原SDK的基础上封装了服务商版,共勉;
二、开发步骤
1.在pom.xml中引入依赖
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>
2.创建基础参数配置类,注意看每个参数的注释
/**
* 服务商版
*/
public interface WXPayConfigUp {
/**
* 获取 服务商商户的APP ID
*
* @return App ID
*/
public String getAppID();
/**
* 子商户公众账号AppID
* 如果需要获取sub_openid,则此参数必传
*
* @return App ID
*/
public String getSubAppID();
/**
* 获取 Mch ID
*
* @return Mch ID
*/
public String getMchID();
/**
* 获取 Mch ID
* 服务商平台创建的子商户号(必须是属于对应的服务商平台创建)
* @return Mch ID
*/
public String getSubMchID();
/**
* 获取 API 密钥
* 服务商平台的API密钥
* @return API密钥
*/
public String getKey();
/**
* 获取商户证书内容
*
* @return 商户证书内容
*/
public InputStream getCertStream();
/**
* HTTP(S) 连接超时时间,单位毫秒
*
* @return
*/
public int getHttpConnectTimeoutMs();
/**
* HTTP(S) 读数据超时时间,单位毫秒
*
* @return
*/
public int getHttpReadTimeoutMs();
}
3.基础参数配置类实现类
/**
* 服务商版
*/
@Data
public class MyWechatpayUpConfig implements WXPayConfigUp {
public String getAppID() {
return null;
}
public String getSubAppID() {
return null;
}
public String getMchID() {
return null;
}
public String getSubMchID() {
return null;
}
public String getKey() {
return null;
}
public InputStream getCertStream() {
return null;
}
public int getHttpConnectTimeoutMs() {
return 0;
}
public int getHttpReadTimeoutMs() {
return 0;
}
}
4.工具类WXPayUp
/**
* 作用:提交刷卡支付<br>
* 场景:刷卡支付
* @param reqData 向wxpay post的请求数据
* @return API返回数据
* @throws Exception
*/
public Map<String, String> microPay(Map<String, String> reqData) throws Exception {
return this.microPay(reqData, this.config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
}
/**
* 作用:提交刷卡支付<br>
* 场景:刷卡支付
* @param reqData 向wxpay post的请求数据
* @param connectTimeoutMs 连接超时时间,单位是毫秒
* @param readTimeoutMs 读超时时间,单位是毫秒
* @return API返回数据
* @throws Exception
*/
public Map<String, String> microPay(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
String url;
if (this.useSandbox) {
url = WXPayConstants.SANDBOX_MICROPAY_URL;
}
else {
url = WXPayConstants.MICROPAY_URL;
}
String respXml = this.requestWithoutCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
return this.processResponseXml(respXml);
}
/**
* 服务商版
* 向 Map 中添加 appid、mch_id、nonce_str、sign_type、sign <br>
* 该函数适用于商户适用于统一下单等接口,不适用于红包、代金券接口
*
* @param reqData
* @return
* @throws Exception
*/
public Map<String, String> fillRequestData(Map<String, String> reqData) throws Exception {
reqData.put("appid", config.getAppID());
reqData.put("sub_appid",config.getSubAppID());
reqData.put("mch_id", config.getMchID());
reqData.put("sub_mch_id",config.getSubMchID());
reqData.put("nonce_str", WXPayUtil.generateNonceStr());
if (WXPayConstants.SignType.MD5.equals(this.signType)) {
reqData.put("sign_type", WXPayConstants.MD5);
}
else if (WXPayConstants.SignType.HMACSHA256.equals(this.signType)) {
reqData.put("sign_type", WXPayConstants.HMACSHA256);
}
reqData.put("sign", WXPayUtil.generateSignature(reqData, config.getKey(), this.signType));
return reqData;
}
5.主体报文逻辑如下
/**
* 服务商版-付款码支付
* @param
*/
public void weChatPayMicroPay() throws Exception {
//主要参数
MyWechatpayUpConfig myWechatpayUpConfig = new MyWechatpayUpConfig();
WXPayUp wxPayUp = new WXPayUp(myWechatpayUpConfig);
//组装参数
//组装参数
Map<String,String> requestData = new HashMap<String, String>();
requestData.put("body","你的标语");
requestData.put("out_trade_no","商户系统内部订单号");
requestData.put("total_fee","订单总金额,单位为分,只能为整数");
requestData.put("spbill_create_ip","");
requestData.put("auth_code","付款码");
//发起支付
Map<String, String> mapBack = wxPayUp.microPay(requestData);
if("SUCCESS".equals(mapBack.get("return_code"))){
if("SUCCESS".equals(mapBack.get("result_code"))){
//支付成功,处理业务
}else{
System.out.println("接口异常信息====="+mapBack.get("err_code_des"));
}
}else{
System.out.println("通信异常信息====="+mapBack.get("return_msg"));
}
}
了解更多资讯,请关注此公众号!!!