阿里支付接口的验证机制和普通接口不同,采用的是证书验证,使用支付宝开放平台助手 ---> 生成**获取csr文件
公司注意些支付对应的支付宝程序所在的公司的名称。
得到生成好的3个文件
放入对应的文件夹
private String APP_ID = ""; //application private key private String APP_PRIVATE_KEY = "";
//charset private String CHARSET = "utf-8"; //sign type private String SIGN_TYPE = "RSA2";
/**
* 支付相关接口采用csr方式验证
*
* @return
*/
private AlipayClient getClientInstanceByKey() throws AlipayApiException {
AlipayClient aplipayClient = aliMap.get("client");
if (aplipayClient == null) {
CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
//设置网关地址
certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do");
//设置应用Id
certAlipayRequest.setAppId(APP_ID);
//设置应用私钥
certAlipayRequest.setPrivateKey(APP_PRIVATE_KEY);
//设置请求格式,固定值json
certAlipayRequest.setFormat("json");
//设置字符集
certAlipayRequest.setCharset(CHARSET);
//设置签名类型
certAlipayRequest.setSignType(SIGN_TYPE);
//设置应用公钥证书路径
certAlipayRequest.setCertPath("/home/crt/appCertPublicKey_xxx.crt");
//设置支付宝公钥证书路径
certAlipayRequest.setAlipayPublicCertPath("/home/crt/alipayCertPublicKey_RSA2.crt");
//设置支付宝根证书路径
certAlipayRequest.setRootCertPath("/home/crt/alipayRootCert.crt");
aplipayClient = new DefaultAlipayClient(certAlipayRequest);
aliMap.put("client", aplipayClient);
}
return aplipayClient;
}
/**
* 支付宝向用户转账
*
* @param bizNo 逻辑单号
* @param amount 转账金额 单位元
* @param account 支付宝账号
* @return
*/
public RestResult<Integer> alipay2User(String bizNo, String amount, String account) {
// 设置请求参数
AlipayFundTransUniTransferRequest alipayRequest = new AlipayFundTransUniTransferRequest();
Map<String, String> map = new HashMap<>();
map.put("out_biz_no", bizNo);
map.put("trans_amount", amount);
map.put("product_code", "TRANS_ACCOUNT_NO_PWD");
map.put("biz_scene", "DIRECT_TRANSFER");
map.put("order_title", "");
map.put("remark", ""+amount);
// 转账账户
Map<String, String> map2 = new HashMap<>();
map2.put("identity", account);
map2.put("identity_type", "ALIPAY_USER_ID");
map2.put("name", "");
map.put("payee_info", JSONObject.toJSONString(map2));
// 转成json格式放入
String json = JSONObject.toJSONString(map);
alipayRequest.setBizContent(json);
AlipayFundTransUniTransferResponse response;
try {
response = getClientInstanceByKey().certificateExecute(alipayRequest);
System.out.println(JSON.toJSONString(response));
if (response.isSuccess()) {
return RestResult.wrapSuccessResponse();
} else {
log.info("支付失败,bizNo:"+bizNo+",原因:"+response.getBody());
return RestResult.wrapErrorResponse("支付失败");
}
} catch (Exception e) {
e.printStackTrace();
log.info("支付失败,bizNo:"+bizNo+",异常原因:"+e);
return RestResult.wrapErrorResponse("支付失败");
}
}
关键就是getClientInstanceByKey().certificateExecute(alipayRequest); ,支付相关接口采用证书验证方式才能通过,支付宝转账的demo有点坑