@File
2019-10-31T06:21:06.000000Z
字数 2972
阅读 168
java
第三方api
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.0.0</version>
</dependency>
alipay:
# 阿里网关(沙箱和正式网关不一样)
gateway: https://openapi.alipaydev.com/gateway.do
# 编码格式 UTF-8/GBK
charset: UTF-8
# 签名规则 RSA/RSA2
sign-type: RSA
# 阿里公钥(后台获取)
public-key: MIIBIjANBgkqhkiG9w***
# 商户信息
app-infor:
# 支付成功回调验签接口(自定义的外网接口)
notify-url: http://127.0.0.1:8800/PayNotify
# appid(后台获取)
id: 2016***
# 商户私钥(后台获取)
private-key: MIIEvgIBADANBgkqhkiG9w0BAQ***
@Component
public class AlipayUtil {
/**
* 数据格式(固定)
*/
private String format = "json";
/**
* 支付宝网关
*/
@Value("${alipay.gateway}")
private String gateway;
/**
* appid
*/
@Value("${alipay.app-infor.id}")
private String appId;
/**
* 应用私钥
*/
@Value("${alipay.app-infor.private-key}")
private String appPrivateKey;
/**
* 编码格式
*/
@Value("${alipay.charset}")
private String charset;
/**
* 支付宝公钥
*/
@Value("${alipay.public-key}")
private String alipayPublicKey;
/**
* 签名类型
*/
@Value("${alipay.sign-type}")
private String signType;
/**
* 回调地址
*/
@Value("${alipay.app-infor.notify-url}")
private String notifyUrl;
/**
* 电脑网页支付
* @param url 请求成功跳转页面地址
* @param jsonConfig 配置json字符串
* @return html字符串
*/
public String webPay(String url,String jsonConfig){
//实例化客户端
AlipayClient alipayClient = new DefaultAlipayClient(gateway, appId, appPrivateKey, format, charset, alipayPublicKey, signType);
String form = "";
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
// 客户端跳转地址
request.setReturnUrl(url);
// 在公共参数中设置回跳和通知地址
request.setNotifyUrl(notifyUrl);
// 设置请求参数
request.setBizContent(jsonConfig);
try {
// 调用SDK生成html表单,带js自动提交表单
form = alipayClient.pageExecute(request).getBody();
} catch (AlipayApiException e) {
e.printStackTrace();
}
// 返回html表单字符串
return form;
}
/**
* 支付宝回调参数
* @param paramsMap 回调参数
* @param afterSuccess 成功执行的方法
* @return 响应给支付宝的内容
*/
public String signature(Map<String, String> paramsMap, AfterSuccess afterSuccess){
// 默认失败的响应内容
String res = "failure";
try {
// 验签
if(AlipaySignature.rsaCheckV1(paramsMap, alipayPublicKey, charset, signType)){
// 成功响应前的业务逻辑
afterSuccess.success(paramsMap);
// 成功的响应内容
res = "success";
}
} catch (AlipayApiException e) {
e.printStackTrace();
}
return res;
}
/**
* 验签成功辅助接口
*/
public interface AfterSuccess {
/**
* 成功执行的方法
* @param params 支付宝传来的参数
*/
void success(Map<String, String> params);
}
}
public String pay(int oid) {
// 通过数据库找到订单信息
Order order = orderMapper.findById(oid);
// 组合成json
String json = "{"
// 订单号必须唯一
+ "\"out_trade_no\":\""+order.getOutTradeNo()+'"'
+ ",\"product_code\":\"FAST_INSTANT_TRADE_PAY\""
// 金额
+ ",\"total_amount\":"+order.getPrice()
// 标题
+ ",\"subject\":\""+order.getSubject()+'"'
+ "}";
return alipayUtil.webPay("https://www.baidu.com/",json);
}
// 验签接口
@PostMapping(value = "/PayNotify")
// 注意:支付宝传过来的参数是表单参数,不能用 @RequestBody 接收
public String payNotify(@RequestParam Map<String,String> collBack){
String signature = alipayUtil.signature(collBack, params -> {
//验签成功执行的业务操作
});
// 给支付宝响应结果
return signature;
}