1.付款接口類
1.1.引入Maven依賴
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.38.221.ALL</version>
</dependency>
1.2.將下面代碼保存為AlipayTemplate.java
@Configuration
@ConfigurationProperties("alipay")
@Data
public class AlipayTemplate {
private String notifyUrl="";
private String returnUrl="";
private String serverUrl;//網(wǎng)關(guān)地址
private String appId;//應(yīng)用ID
private String privateKey;//私鑰
private String format="json";
private String charset="UTF-8";
private String alipayPublicKey;//公鑰
private String signType="RSA2";
public String pay(String outTradeNo, BigDecimal totalAmount,String subject) throws AlipayApiException {
AlipayClient alipayClient = new DefaultAlipayClient(
serverUrl,//網(wǎng)關(guān)地址
appId,//應(yīng)用ID
privateKey,//私鑰
format,
charset,
alipayPublicKey,//公鑰
signType//加密算法
);
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
//異步接收地址,僅支持http/https,公網(wǎng)可訪問
request.setNotifyUrl(notifyUrl);
//同步跳轉(zhuǎn)地址,僅支持http/https
request.setReturnUrl(returnUrl);
/******必傳參數(shù)******/
JSONObject bizContent = new JSONObject();
//商戶訂單號(hào),商家自定義,保持唯一性
bizContent.put("out_trade_no", outTradeNo);
//支付金額,最小值0.01元,保留兩位小數(shù)向上取整
bizContent.put("total_amount", totalAmount.setScale(2, RoundingMode.UP));
//訂單標(biāo)題,不可使用特殊符號(hào)
bizContent.put("subject", subject);
//電腦網(wǎng)站支付場(chǎng)景固定傳值FAST_INSTANT_TRADE_PAY
bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");
/******可選參數(shù)******/
/**
* time_expire可選string(32)
* 【描述】訂單絕對(duì)超時(shí)時(shí)間。
* 格式為yyyy-MM-dd HH:mm:ss。超時(shí)時(shí)間范圍:1m~15d。
* 注:time_expire和timeout_express兩者只需傳入一個(gè)或者都不傳,兩者均傳入時(shí),優(yōu)先使用time_expire。
* 【示例值】2016-12-31 10:05:01
*/
//bizContent.put("time_expire", LocalDateTime.now(ZoneId.of("Asia/Shanghai")).plusMinutes(1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
//// 商品明細(xì)信息,按需傳入
//JSONArray goodsDetail = new JSONArray();
//JSONObject goods1 = new JSONObject();
//goods1.put("goods_id", "goodsNo1");
//goods1.put("goods_name", "子商品1");
//goods1.put("quantity", 1);
//goods1.put("price", 0.01);
//goodsDetail.add(goods1);
//bizContent.put("goods_detail", goodsDetail);
//// 擴(kuò)展信息,按需傳入
//JSONObject extendParams = new JSONObject();
//extendParams.put("sys_service_provider_id", "2088511833207846");
//bizContent.put("extend_params", extendParams);
request.setBizContent(bizContent.toString());
AlipayTradePagePayResponse response = alipayClient.pageExecute(request,"POST");
// 如果需要返回GET請(qǐng)求,請(qǐng)使用
// AlipayTradePagePayResponse response = alipayClient.pageExecute(request,"GET");
String pageRedirectionData = response.getBody();
// System.out.println(pageRedirectionData);
return pageRedirectionData;
/*if(response.isSuccess()){
System.out.println("調(diào)用成功");
} else {
System.out.println("調(diào)用失敗");
}*/
}
}
1.3.支付調(diào)用范例
@RequiredArgsConstructor
@Controller
public class PayWebController {
private final AlipayTemplate alipayTemplate;//依賴注入
@ResponseBody
@GetMapping(value = "/pay",produces = MediaType.TEXT_HTML_VALUE)
public String payOrder(@RequestParam("orderSn") String orderSn) throws AlipayApiException {//傳入orderSn訂單號(hào)
BigDecimal totalAmount = new BigDecimal(100);//支付金額
String subject = "支付測(cè)試";//支付標(biāo)題
return alipayTemplate.pay(orderSn,totalAmount,subject);
}
}
2. 支付異步回調(diào)函數(shù)模板
@RequiredArgsConstructor
@Controller
public class payedListener {
private final AlipayTemplate alipayTemplate;
@ResponseBody
@PostMapping("/payed/notify")
public String handleAlipayed(@RequestParam Map<String,String> paramsMap) throws AlipayApiException {
try {
boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, alipayTemplate.getAlipayPublicKey(), alipayTemplate.getCharset(), alipayTemplate.getSignType()); //調(diào)用SDK驗(yàn)證簽名
if(signVerified){
//驗(yàn)簽成功,執(zhí)行正常業(yè)務(wù)代碼
return "success";
}else{
//驗(yàn)簽失敗
}
}catch (Exception ignored){
}
return "failure";
}
}