外卖项目,骑手提现收益到银行卡。
以下是我写的一个简单demo
开发文档:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=24_2
提现到银行卡是需要证书的,而且付款的微信商户号还需要几个月的流水记录
实现步骤
1.引入依赖
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>wx-java-pay-spring-boot-starter</artifactId>
<version>4.0.0</version>
</dependency>
配置yml
wx:
pay:
appId: 你的小程序appid
mchId: 商户号id
mchKey: 商户号秘钥
subAppId: #服务商模式下的子商户公众账号ID
subMchId: #服务商模式下的子商户号
keyPath: classpath:/wx/apiclient_cert.p12 # p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头)
#keyPath: D:/zs/apiclient_cert.p12 # p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头)
secret: 你的秘钥``
appId、mchId、mchKey、keyPath必填
二、
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* wxpay pay properties.
*
* @author Binary Wang
*/
@Data
@ConfigurationProperties(prefix = "wx.pay")
public class WxPayProperties {
/**
* 设置微信公众号或者小程序等的appid
*/
private String appId;
/**
* 微信支付商户号
*/
private String mchId;
/**
* 微信支付商户密钥
*/
private String mchKey;
/**
* 服务商模式下的子商户公众账号ID,普通模式请不要配置,请在配置文件中将对应项删除
*/
private String subAppId;
/**
* 服务商模式下的子商户号,普通模式请不要配置,最好是请在配置文件中将对应项删除
*/
private String subMchId;
/**
* apiclient_cert.p12文件的绝对路径,或者如果放在项目中,请以classpath:开头指定
*/
private String keyPath;
}
/**
* @author Binary Wang
*/
@Configuration
@ConditionalOnClass(WxPayService.class)
@EnableConfigurationProperties(WxPayProperties.class)
@AllArgsConstructor
public class WxPayConfiguration {
private WxPayProperties properties;
@Bean
@ConditionalOnMissingBean
public WxPayService wxService() {
WxPayConfig payConfig = new WxPayConfig();
payConfig.setAppId(StringUtils.trimToNull(this.properties.getAppId()));
payConfig.setMchId(StringUtils.trimToNull(this.properties.getMchId()));
payConfig.setMchKey(StringUtils.trimToNull(this.properties.getMchKey()));
payConfig.setSubAppId(StringUtils.trimToNull(this.properties.getSubAppId()));
payConfig.setSubMchId(StringUtils.trimToNull(this.properties.getSubMchId()));
payConfig.setKeyPath(StringUtils.trimToNull(this.properties.getKeyPath()));
// 可以指定是否使用沙箱环境
payConfig.setUseSandboxEnv(false);
WxPayService wxPayService = new WxPayServiceImpl();
wxPayService.setConfig(payConfig);
return wxPayService;
}
}
import com.github.binarywang.wxpay.bean.entpay.EntPayBankRequest;
import com.github.binarywang.wxpay.bean.entpay.EntPayBankResult;
import com.github.binarywang.wxpay.bean.entpay.EntPayResult;
import com.github.binarywang.wxpay.exception.WxPayException;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@Api("企业付款")
@RequestMapping("/pay")
@RestController
@AllArgsConstructor
public class EntPayController {
@Resource
MyWxPayService myWxPayService;
/**
* 企业付款到银行卡.
* <pre>
* 用于企业向微信用户银行卡付款
* 目前支持接口API的方式向指定微信用户的银行卡付款。
* 文档详见:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=24_2
* 接口链接:https://api.mch.weixin.qq.com/mmpaysptrans/pay_bank
* </pre>
*
* @param request 请求对象
* @return the ent pay bank result
* @throws WxPayException the wx pay exception
*/
@ApiOperation(value = "企业付款到银行卡")
@PostMapping("/payBank")
public EntPayBankResult payBank(EntPayBankRequest request) throws WxPayException,Exception {
return myWxPayService.payBankTest();
}
}
public EntPayBankResult payBankTest() throws Exception {
EntPayBankRequest.EntPayBankRequestBuilder entPayBankRequestBuilder = EntPayBankRequest.builder();
String amount = txje.multiply(BigDecimal.valueOf(100)).stripTrailingZeros().toPlainString();
EntPayBankRequest entPayBankRequest = entPayBankRequestBuilder
.partnerTradeNo(IdUtils.genUniqueKey()) //商户企业付款单号.
.encBankNo("") //收款方银行卡号.
.encTrueName("") //收款方用户名.
.bankCode("1002") //收款方开户行. 银行卡所在开户行编号,详见银行编号列表
.amount(Integer.valueOf(amount)) //提现金额:RMB分(支付总额,不含手续费) 注:大于0的整数
.description("提现测试") //企业付款到银行卡付款说明,即订单备注(UTF8编码,允许100个字符以内)不必填
.build();
EntPayBankResult entPayResult = wxPayService.getEntPayService().payBank(entPayBankRequest);
return entPayResult;
}```