Browse Source

feature1.0.0-img:添加支付宝提现功能,优化提现方法

master
chengkun 4 years ago
parent
commit
2ab237baaf
  1. 8
      bnyer-services/bnyer-img/pom.xml
  2. 109
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/CreatorMiniController.java
  3. 10
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/domain/WithdrawLog.java
  4. 6
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/WithdrawDto.java
  5. 7
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/WithdrawPageDto.java
  6. 16
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/WithdrawLogServiceImpl.java
  7. 6
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/WithdrawLogVo.java
  8. 7
      bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/WithdrawLogMapper.xml

8
bnyer-services/bnyer-img/pom.xml

@ -109,6 +109,14 @@
<artifactId>weixin-java-pay</artifactId>
<version>4.2.0</version>
</dependency>
<!-- 阿里支付工具包-->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.23.21.ALL</version>
</dependency>
</dependencies>
<build>

109
bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/CreatorMiniController.java

@ -1,6 +1,15 @@
package com.bnyer.img.controller;
import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson.JSON;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.CertAlipayRequest;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayFundTransUniTransferModel;
import com.alipay.api.domain.Participant;
import com.alipay.api.request.AlipayFundTransUniTransferRequest;
import com.alipay.api.response.AlipayFundTransUniTransferResponse;
import com.bnyer.common.core.web.controller.BaseController;
import com.bnyer.common.core.web.domain.AjaxResult;
import com.bnyer.img.domain.TiktokImg;
@ -249,4 +258,104 @@ public class CreatorMiniController extends BaseController {
log.info("小程序艺术家数据参数为:{}", JSON.toJSON(param));
return AjaxResult.success(creatorService.login(param));
}
//@TokenCheck
@ApiOperation(value="支付宝异步回调")
@GetMapping(value = "/callback")
public AjaxResult alipayCallback(){
log.info("支付宝回调了!");
return AjaxResult.success();
}
//@TokenCheck
@ApiOperation(value="提现")
@GetMapping(value = "/withdraw")
public AjaxResult withdraw() throws AlipayApiException {
String sandboxGatewayUrl = "https://openapi.alipaydev.com/gateway.do";
String gatewayUrl = "https://openapi.alipay.com/gateway.do";
String sandboxPrivateKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC1rI3A7cuj7vjBZpU+AYqTsQJxXGMvUlPdVZmuJJR/o3NY+jxIiSDOA/HjChJ2v8DlZXDmpzgJ+DQt1+GZkNr/yGt335jd9JBZuNEUO19iFjnlWnwPu6enp829IqBJv65km0ATA73jVnj2gW9E9bRkpwbrXdf9FSYvb14+6P1sKGavCVHLjafWIbBavaOXJlaEjR+U62nghHoiIP1RL49xsvBV8VtRXQfnCUPaOGU4PZbvYne3FzTbjIDwqbYWsfTfO4dIo1z2jkGNzPi8ZGrVe8PJsXBRl7A9qK5EI2wBwDpgWmrkUs2avfMkSYWfrrTJ4WnurCiNomxRszylGcHNAgMBAAECggEAdlABoPs7+27NoWXlG5R1YumL5bd9AHxlEWeFxdscumL/45pTWAm1y3TWOj18+Mi4HqyJcizEWfnCQXit+wxTEvC6zD5Zl3KF72hlAQAJhh9jZPIgiT50WML3QY0jReQG9o4ElF2DdGIENMTmacp5yHLeFrnux2rWi13DysSBBcXQ8rYS88jyT6L0xqWb8M7TD0MzZYyRBOFm4Nv91FBoj2vWtxNz5T9hJfX8AGO5HChR4NgvclM1Jbq+k9/6oeEEBU5m3AuIo2DEy1mQbVvA80hJMsi38Na+5CyfdXjm9wJ7v95/opcjgWAPrHrDdBngVeMuvmm2qj31b7ZHp3z+AQKBgQDZV2JJMA4dy6zyLbc2ImNLfU8iDyzuXAMKRgwrU0/wLnJRrvFJsIxzRnQxM9yF+Yo9bxqAv0nUisYIInhmGMVo8L8+nCyTHK1KYbOa2O+9grQiY/8p+lGlesrMKUnbUgbwS2Sj//hLmgor+f/pnp99xnmkkwV1CfAj69iaDL2LnQKBgQDV/RAJ8JmnjFHhGW7T0U7xtCR+jLO+EGpVaAlPznmTpr83IZbFnaDMEN9XhKCHk7iwDx6+bTSko/tfnyDEP5f2LjHuHH6hQyZBPIUSB9nvgB5Dtky43yzNtO4UkpH+MFCeFun5v+RtmyUELMSksjxwKjRBV3lG5pDW1NIxjk2v8QKBgHCEFJXfEu/J6ZbWo+qakt0Z2kW/pXsgl1JSQSqMzu2Anh47ex6zD4L+DlkKiDezoCV9xzKv1QD7dtnvPnVcjZZuTBOVtl3SksPXIKwhcruhVrAXJJoOxQXuM97N4TZxmLX90fQ1J827yVhK7Hl9bQQoJAFXO5QDuRZfmprlzZrhAoGBAIGewuJifZDCLK7fiwR/mwRKDHkjnZUZuG93j3xqI7bOoLEyhXO64bX62m7XBa5aSttKrWLIH8VDF3d6moyFwPT8Un5bgFEKrdeCY1DitJ6gyrRVbu/lL+yDFlwb1JdWiN7aHmyMUkAaZDe9LnhdBsMirXiPFgVekImxbIlcG67hAoGBAJIhIcvXkYbXZSP6SLFoT0NsG2hPYNwSr3+4u4acT3mBD519EA9kBvmAom56l7t6xoIVjgREuz0Kaa+V24+Za5o14LJA0iBxgKBIqD5ABMY6XkgPMY5p1/eVUWoXPmx4KsS/ys0MX60Kf0xgLD0gW0j+x1vsA8w1GiJXTAT0JZWP";
String privateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCGq3UKNbNuIazHbD9slLNJsStw2347rYwR1NmFLCi/d62yNLeTZvmrY4aW3GsDsQiK5vFdLRxaT8tIkGO11GilBRn00xkNKnwPkMA8GUdtr7GaudH+YBqk2snDeBhtdlYLq1V79USGZKdnpsPoUIXVIpyhnBlULzcJP7hf7NSauRVBnDf+MuEQOjhRAc6i8RN7nY2Oz5x6ZuIPhJ8qWjbZQoN6sJ00KU5oYZaN34/NGmPIfpR4QwbZbABm0Y0dCwkXzzNoV3cPYsFqKWNN8gxY7mI7YQqYsVb25fvALDjOl0XUGv1D7lMOC4mX3iz4q8b13ZNK+Tb3y4atwO6jK0EdAgMBAAECggEAUb4ZGM1n0F2YZqQKC3pnKT/lQme4w7if4OL19aPMSAv43sao90v2GFYdB81bF66JpOZxc0FCiH8OwUkDfQclTaU/ECBigF9dVoViahheBvIyN9y63lCvW4mCFqf7C9ZcfFDPXqKNqZXHF19eYtEdqzWLJX1+0l6mZXLME03J7u+tPX+OOnjf/K3wBp90RzoS02Ofp8fxiRyiDwFwlcxfRVbffLPVIW8JMqyOuI95U0l90F3N48+twJj8UeZlWHQeTGSDZ5jgfC6T5SXkDxOi6e7ZemZUG43rqsEHyb84fBfpr4ZFh9SkjXSnRih5w0VRws50dE2u1wAeCLG8K5KD8QKBgQDX/rpHjIJl0aD2LsI1kcUW82Yzm7qOJWApRCTe/+mZtrNGotzz/Mc2S0xV8s95ahgsH9AYqytu58UdM0CQhJ5+57fPDQcYWq9QvHB741ljAd1371qTLvRsMQg6E/nmObFvAON7ynNuh+TfkM9e7HQS6dpA0FkVqrREdD7hgUeUewKBgQCfnL3GKdMdH5FTTMBJgiLwHYBpgFQxDPzD5DEvz9lgCgosk76k4jQGi/3/raJWxkAED5K4O2J90IE/VnRXV4Uhi4h54D3ceO9dtXWBN1IxqEuO7pw9ldiRjFrlTo4aSgnq2wrjiVKn92Fm2YXIcAyhibUs7hamWt6LGAULbM5JRwKBgG11jXlM35gxz9xyfcEgCj1DQ/vLY5M9panD+tt33S4kxF17k3WiGGKPbjPwROxGs9FInfCibfRaSC4wFvwl+Rxe2Wt4MqxI6KeFl4tw/4+JFm79QW1tUjix8HVeQjpF6oFSdfX59t2AyJ/zhuOX+IrNL+nArCSqyYgXUPZ+yYOZAoGATbLAkxnDInc+iF1hcac/GMJTw4fr9CDNXxLTeuHkgKMChua5NIzFJLa7Q96jmzhQ62klVDfcX0DD2jBc3DPHpCfHnQSzOINKisSN2gQzJ+c0OPUg673pOhkoGl5eQJ/wKfrNVyx/JzL+oFGdlZAuJejiYGfacMrlcLKVqhUiansCgYEAtPCz8J3fYipscjdWKQIXsejr110KF0zsh8X7ZYKxhAgRZ5ck3wbMbffYIfa7wCm5nIJMY640P3Jh6Rb5W5/4/i04gHbE1Loi714aGCXoY6gm5oVoKIFP8h3g3MyQl7mZ2huAA/KnLsThlmfQ0l0n6Pd8xEcqJ+Ggi/GS2MQQrIw=";
String sandboxAppId = "2021000121609470";
String appId = "2021003135690045";
String sandboxCertPath = "D:/sandbox/appCertPublicKey_2021000121609470.crt";
String certPath = "D:/onlineKey/appCertPublicKey_2021003135690045.crt";
String sandboxAlipayPublicCertPath = "D:/sandbox/alipayCertPublicKey_RSA2.crt";
String alipayPublicCertPath = "D:/onlineKey/alipayCertPublicKey_RSA2.crt";
String sandboxRootPath = "D:/sandbox/alipayRootCert.crt";
String rootPath = "D:/onlineKey/alipayRootCert.crt";
String sandboxIdentify = "yglaxq2770@sandbox.com";
String identify = "19983455096";
String sandboxName = "yglaxq2770";
String name = "权煜航";
//构造client
CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
//设置网关地址
//certAlipayRequest.setServerUrl(sandboxGatewayUrl);
certAlipayRequest.setServerUrl(gatewayUrl);
//设置应用Id
//certAlipayRequest.setAppId(sandboxAppId);
certAlipayRequest.setAppId(appId);
//设置应用私钥
//certAlipayRequest.setPrivateKey(sandboxPrivateKey);
certAlipayRequest.setPrivateKey(privateKey);
//设置请求格式,固定值json
certAlipayRequest.setFormat("json");
//设置字符集
certAlipayRequest.setCharset("UTF8");
//设置签名类型
certAlipayRequest.setSignType("RSA2");
//设置应用公钥证书路径
//certAlipayRequest.setCertPath(sandboxCertPath);
certAlipayRequest.setCertPath(certPath);
//设置支付宝公钥证书路径
//certAlipayRequest.setAlipayPublicCertPath(sandboxAlipayPublicCertPath);
certAlipayRequest.setAlipayPublicCertPath(alipayPublicCertPath);
//设置支付宝根证书路径
//certAlipayRequest.setRootCertPath(sandboxRootPath);
certAlipayRequest.setRootCertPath(rootPath);
//构造client
AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);
AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel();
model.setOutBizNo(IdUtil.getSnowflakeNextIdStr());
model.setTransAmount("0.9");
model.setProductCode("TRANS_ACCOUNT_NO_PWD");
/** 场景码,单笔无密转账到支付宝账户固定为:DIRECT_TRANSFER **/
model.setBizScene("DIRECT_TRANSFER");
/** 转账业务的标题,用于在支付宝用户的账单里显示 **/
model.setOrderTitle("bnyer提现打款");
Participant participant = new Participant();
/** 参与方的唯一标识,收款支付宝账号或者支付宝吧账号唯一会员ID **/
//participant.setIdentity(sandboxIdentify);
participant.setIdentity(identify);
/** 参与方的标识类型:ALIPAY_USER_ID 支付宝的会员ID ALIPAY_LOGON_ID手机号登录 **/
participant.setIdentityType("ALIPAY_LOGON_ID");
/** 参与方真实姓名,如果非空,将校验收款支付宝账号姓名一致性。当identity_type=ALIPAY_LOGON_ID时,本字段必填 **/
//participant.setName(sandboxName);
participant.setName(name);
model.setPayeeInfo(participant);
/** 业务备注 **/
model.setRemark("提现打款");
request.setBizModel(model);
log.info("支付宝提现入参为:{}",JSON.toJSONString(request));
AlipayFundTransUniTransferResponse response = null;
try {
response = alipayClient.certificateExecute(request);
} catch (AlipayApiException e) {
e.printStackTrace();
}
/** 获取接口调用结果,如果调用失败,可根据返回错误信息到该文档寻找排查方案:https://opensupport.alipay.com/support/helpcenter/107 **/
log.info("支付宝提现响应结果为:{}",response.getBody());
return AjaxResult.success();
}
}

10
bnyer-services/bnyer-img/src/main/java/com/bnyer/img/domain/WithdrawLog.java

@ -56,11 +56,19 @@ public class WithdrawLog extends BaseDomain {
@Desensitized(type = SensitiveTypeEnum.BANK_CARD)
private String bankNo;
/**
* 支付宝手机号(加密)
*/
@TableField(value = "phone")
@ApiModelProperty(value="支付宝手机号(加密)")
@Desensitized(type = SensitiveTypeEnum.MOBILE_PHONE)
private String phone;
/**
* 渠道(0->微信;1->银行卡)
*/
@TableField(value = "channel")
@ApiModelProperty(value="渠道(0->微信;1->银行卡)")
@ApiModelProperty(value="渠道(0->微信;1->银行卡;2->支付宝)")
private String channel;
/**

6
bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/WithdrawDto.java

@ -32,8 +32,12 @@ public class WithdrawDto implements Serializable {
@Desensitized(type = SensitiveTypeEnum.BANK_CARD)
private String bankNo;
@ApiModelProperty(value="支付宝手机号(加密)")
@Desensitized(type = SensitiveTypeEnum.MOBILE_PHONE)
private String phone;
@NotBlank(message = "渠道不能为空!")
@ApiModelProperty(value="渠道(0->微信;1->银行卡)")
@ApiModelProperty(value="渠道(0->微信;1->银行卡;2->支付宝)")
private String channel;
public WithdrawLog extractParam(){

7
bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/WithdrawPageDto.java

@ -1,5 +1,7 @@
package com.bnyer.img.dto;
import com.bnyer.common.core.annotation.Desensitized;
import com.bnyer.common.core.enums.SensitiveTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
@ -14,7 +16,7 @@ public class WithdrawPageDto extends BasePageDto {
@ApiModelProperty(value="流水号")
private String orderId;
@ApiModelProperty(value="渠道(0->微信;1->银行卡)")
@ApiModelProperty(value="渠道(0->微信;1->银行卡;2->支付宝)")
private String channel;
@ApiModelProperty(value="状态(0->待审核;1->提现中;2->提现成功;3->提现失败)")
@ -22,4 +24,7 @@ public class WithdrawPageDto extends BasePageDto {
@ApiModelProperty(value="银行卡(加密)")
private String bankNo;
@ApiModelProperty(value="支付宝手机号(加密)")
private String phone;
}

16
bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/WithdrawLogServiceImpl.java

@ -58,6 +58,9 @@ public class WithdrawLogServiceImpl implements WithdrawLogService {
if(StringUtils.isNotBlank(withdrawLog.getBankNo())){
withdrawLog.setBankNo(Sm4Util.sm4Encryption(withdrawLog.getBankNo()));
}
if(StringUtils.isNotBlank(withdrawLog.getPhone())){
withdrawLog.setPhone(Sm4Util.sm4Encryption(withdrawLog.getPhone()));
}
//生成订单id
withdrawLog.setOrderId(IdUtil.getSnowflakeNextIdStr());
return withdrawLogMapper.insert(withdrawLog);
@ -78,13 +81,19 @@ public class WithdrawLogServiceImpl implements WithdrawLogService {
if(StringUtils.isNotBlank(params.getBankNo())){
wrapper.eq(WithdrawLog::getBankNo, Sm4Util.sm4Encryption(params.getBankNo()));
}
if(StringUtils.isNotBlank(params.getPhone())){
wrapper.eq(WithdrawLog::getPhone, Sm4Util.sm4Encryption(params.getPhone()));
}
wrapper.orderByDesc(WithdrawLog::getCreateTime);
List<WithdrawLog> withdrawLogs = withdrawLogMapper.selectList(wrapper);
for (WithdrawLog withdrawLog : withdrawLogs) {
if(StringUtils.isNotBlank(withdrawLog.getBankNo())){
withdrawLog.setBankNo(Sm4Util.sm4Decrypt(withdrawLog.getBankNo()));
DesensitizedUtils.getJsonNoCopy(withdrawLog);
}
if(StringUtils.isNotBlank(withdrawLog.getPhone())){
withdrawLog.setPhone(Sm4Util.sm4Decrypt(withdrawLog.getPhone()));
}
DesensitizedUtils.getJsonNoCopy(withdrawLog);
}
return withdrawLogs;
}
@ -94,8 +103,11 @@ public class WithdrawLogServiceImpl implements WithdrawLogService {
WithdrawLog withdrawLog = withdrawLogMapper.selectById(id);
if(StringUtils.isNotBlank(withdrawLog.getBankNo())){
withdrawLog.setBankNo(Sm4Util.sm4Decrypt(withdrawLog.getBankNo()));
JSONObject.parseObject(DesensitizedUtils.getJsonNoCopy(withdrawLog), WithdrawLog.class);
}
if(StringUtils.isNotBlank(withdrawLog.getPhone())){
withdrawLog.setPhone(Sm4Util.sm4Decrypt(withdrawLog.getPhone()));
}
JSONObject.parseObject(DesensitizedUtils.getJsonNoCopy(withdrawLog), WithdrawLog.class);
return withdrawLog;
}

6
bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/WithdrawLogVo.java

@ -33,7 +33,11 @@ public class WithdrawLogVo implements Serializable {
@Desensitized(type = SensitiveTypeEnum.BANK_CARD)
private String bankNo;
@ApiModelProperty(value="渠道(0->微信;1->银行卡)")
@ApiModelProperty(value="支付宝手机号(加密)")
@Desensitized(type = SensitiveTypeEnum.MOBILE_PHONE)
private String phone;
@ApiModelProperty(value="渠道(0->微信;1->银行卡;2->支付宝)")
private String channel;
@ApiModelProperty(value="状态(0->待审核;1->提现中;2->提现成功;3->提现失败;4->审核拒绝)")

7
bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/WithdrawLogMapper.xml

@ -9,6 +9,7 @@
<result column="order_id" jdbcType="VARCHAR" property="orderId" />
<result column="amt" jdbcType="DECIMAL" property="amt" />
<result column="bank_no" jdbcType="VARCHAR" property="bankNo" />
<result column="phone" jdbcType="VARCHAR" property="phone" />
<result column="reason" jdbcType="VARCHAR" property="reason" />
<result column="status" jdbcType="CHAR" property="status" />
<result column="channel" jdbcType="CHAR" property="channel" />
@ -19,12 +20,12 @@
</resultMap>
<sql id="Base_Column_List">
<!--@mbg.generated-->
id, creator_id, amt, bank_no, `status`, create_time, update_time, sort,is_show,order_id,channel,reason
id, creator_id, amt, bank_no, phone, `status`, create_time, update_time, sort,is_show,order_id,channel,reason
</sql>
<select id="queryFrontList" resultType="com.bnyer.img.vo.WithdrawLogVo">
select
id, creator_id, amt, bank_no,status,create_time,update_time,order_id,channel,reason
id, creator_id, amt, bank_no,phone,status,create_time,update_time,order_id,channel,reason
from img_withdraw_log
where is_show = '1' and creator_id = #{creatorId}
order by create_time desc
@ -32,7 +33,7 @@
<select id="queryFrontDetails" resultType="com.bnyer.img.vo.WithdrawLogVo">
select
id, creator_id, amt, bank_no,status,create_time,update_time,order_id,channel,reason
id, creator_id, amt, bank_no,phone,status,create_time,update_time,order_id,channel,reason
from img_withdraw_log
where is_show = '1' and order_id = #{orderId}
</select>

Loading…
Cancel
Save