需求:
公司需要在app上进行提现,一开始准备提现到银行卡于是找各种第三方,银联看不懂,微信和支付宝这边都有一个条件就是必须有入住90天,30天内有连续不断的流水,于是退而求其次转账到微信余额,结果发现即使转账到微信余额也需要入住满90天,这下只能选择支付宝了。
前置条件:
1、有支付宝商家平台账号。
https://open.alipay.com/
2、有支付宝开放平台账号。
https://business.alipay.com/user/home
Step1:
登录支付宝开发者平台开通如下功能:
开通后可以在绑定的应用信息中查看对应功能,可以看到已生效:
Step2:
查看支付宝接入准备文档:https://opendocs.alipay.com/open/02byum
使用支付宝的API需要进行秘钥获取,目前支付宝秘钥获取有两种,一种普通秘钥,一种证书秘钥,转账操作它这边要求只能是证书秘钥,于是我们根据官方文档指引下获取证书秘钥。
如何获取秘钥查看该文档:https://opendocs.alipay.com/common/02kdnc
支付宝秘钥生成工具:https://opendocs.alipay.com/common/02kipl
最终我们选择证书秘钥的方式并下载对应的证书到本地,一共三个证书。
Step3:
开始查看文档进行接入:https://opendocs.alipay.com/open/309/106236
参考代码:https://wenku.baidu.com/view/8cdde3000422192e453610661ed9ad51f01d54a0.html
我这边直接复制上边的代码,然后引入需要的依赖即可,代码一般写在service里边。
需要注意的点:
1、代码里边有一个对象alipay该对象是一个javaBean自己创建的,我这边替换成AlipayVo
/**
* @author seeklife
* @date 2022年06月22日 11:14
*/
@Data
public class AlipayVo {
private String out_biz_no;
private Double trans_amount;
private PayeeInfo payee_info;
private String product_code;
private String biz_scene;
private String order_title;
private String remark;
}
2、代码顶部的一些公私钥配置我单独放置在另一个类里边改为单例模式,官方文档也说这些配置只需要配置一次即可。
之前下载的证书文件存放在resources下面,这里有个坑,如果使用一般获取classpath下文件的方法获取证书,测试环境没问题,部署到服务器会发现找不到,所以使用我如下代码的方式,也是我从网上找来的。
package co.gpthome.tools.utils;
import co.gpthome.constant.alipay.AlipayConstants;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.CertAlipayRequest;
import com.alipay.api.DefaultAlipayClient;
import lombok.Data;
import org.apache.commons.io.FileUtils;
import org.springframework.util.ResourceUtils;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
/**
* @author seeklife
* @date 2022年06月22日 9:51
*/
public class Alipay {
private static Alipay instance;
static {
try {
instance = new Alipay();
} catch (IOException | AlipayApiException e) {
e.printStackTrace();
}
}
private static AlipayClient alipayClient;
private static CertAlipayRequest certAlipayRequest;
private Alipay() throws IOException, AlipayApiException {
certAlipayRequest = new CertAlipayRequest();
certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do");
//设置应用appId
certAlipayRequest.setAppId(AlipayConstants.APP_ID);
//设置应用私钥
certAlipayRequest.setPrivateKey(AlipayConstants.APP_PRIVATE_KEY);
//设置字符集
certAlipayRequest.setFormat("json");
certAlipayRequest.setCharset("UTF-8");
//设置签名类型
certAlipayRequest.setSignType("RSA2");
//设置应用公钥证书路径
InputStream stream1 = getClass().getClassLoader().getResourceAsStream("你的公钥证书路径");
File targetFile1 = new File("你的公钥证书路径");
FileUtils.copyInputStreamToFile(stream1, targetFile1);
certAlipayRequest.setCertPath(targetFile1.getPath());
// //设置支付宝公钥证书路径 Alipay.class.getResource("/").getPath() + "alipayCertPublicKey_RSA2.crt"
InputStream stream2 = getClass().getClassLoader().getResourceAsStream("支付宝公钥证书路径");
File targetFile2 = new File("支付宝公钥证书路径");
FileUtils.copyInputStreamToFile(stream2, targetFile2);
certAlipayRequest.setAlipayPublicCertPath(targetFile2.getPath());
//设置支付宝根证书路径
InputStream stream3 = getClass().getClassLoader().getResourceAsStream("支付宝根证书路径");
File targetFile3 = new File("支付宝根证书路径");
FileUtils.copyInputStreamToFile(stream3, targetFile3);
certAlipayRequest.setRootCertPath(targetFile3.getPath());
//构造client
alipayClient = new DefaultAlipayClient(certAlipayRequest);
}
public static Alipay getInstance(){
return instance;
}
public AlipayClient getAlipayClient() {
return alipayClient;
}
public CertAlipayRequest getCertAlipayRequest() {
return certAlipayRequest;
}
}
使用方法就是在使用api之前都需要调用alipayClient这个类对象,那直接getInstance获取就好了。
3我们转账的账户可以使用alipay的支付宝账号,也可以使用uid就是支付宝第三方登录获取该用户信息的那个uid。
Step4:
测试提现功能,根据文档得知alipay这边转账到余额最小转账余额不得低于0.1元,转账之前记得保证你商户支付宝的余额里有钱,如果你对接了支付操作可以事先支付点钱到商户账户中。支付成功之后可以到提现账户的账单中查看。