1、準備工作
支付寶開發api(手機網站支付):https://docs.open.alipay.com/api_1/alipay.trade.wap.pay
1.1、登入螞蟻金服開放平台
https://open.alipay.com/platform/manageHome.htm
1.2、選擇控制台 -》網站&移動應用
1.3建立應用
1.4添加能力
1.5下載下傳簽名工具,位址:https://docs.open.alipay.com/291/105971/ ,下載下傳windows,點選:RSA簽名驗簽工具
1.6點選生成秘鑰,生成商戶私鑰和應用秘鑰,并且會以文本(txt)的方式儲存起來
生成秘鑰過程具體看支付寶文檔
1.7 拿到APPID 應用公鑰私鑰支付寶公鑰 回到商家中心 綁定APPID 送出稽核 稽核通過應用處于已上線才能進行測試對接
2、代碼開發
2.1 引入java sdk包
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.7.26.ALL</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
2.2 開發配置類
不使用應用公鑰
public class PayConfig {
// 應用ID
public static String APP_ID = "2021003124687304";
// 應用私鑰
public static String MERCHANT_PRIVATE_KEY = "MIIEvQIBADA****";
// 應用公鑰
public static String ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9***";
// 支付寶公鑰
public static String ZFB_PUBLIC_ID = "MIIBIjANBgkqhkiG9*****";
// 異步通知 【稍後會進行解釋】
public static String notify_url = "http://**.**.**/api/pay/aliCallback";
// 支付成功後出現幾秒的回調頁面
public static String return_url = "****";
// 簽名方式
public static String SIGN_TYPE = "RSA2";
// 字元編碼格式
public static String CHARSET = "utf-8";
//資料類型
public static String format = "json";
//銷售産品碼,商家和支付寶簽約的産品碼,預設值為:QUICK_WAP_WAY
public static String productCode = "QUICK_WAP_WAY";
// 支付寶網關 alipaydev 為沙箱網關
public static String GATEWAYURL = "https://openapi.alipay.com/gateway.do";
}
2.3拉起支付代碼
/**
* 支付寶支付
*
* @return
*/
private String aliPay(NftOrder nftOrder) throws AlipayApiException {
//獲得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(PayConfig.GATEWAYURL, PayConfig.APP_ID,
PayConfig.MERCHANT_PRIVATE_KEY, "json", PayConfig.CHARSET, PayConfig.ZFB_PUBLIC_ID,
PayConfig.SIGN_TYPE);
//該筆訂單允許的最晚付款時間
String timeout = "30m";
//設定請求參數
String content = "{\"out_trade_no\":\"" + "系統訂單号"+ "\","
+ "\"total_amount\":\"" + "0.01" + "\","
+ "\"subject\":\"" + "商品名稱") + "\","
+ "\"timeout_express\":\"" + timeout + "\","
+ "\"body\":\"" + "商品描述" + "\","
+ "\"product_code\":\"" + PayConfig.productCode + "\"}";
AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();
alipayRequest.setReturnUrl(PayConfig.return_url);
alipayRequest.setNotifyUrl(PayConfig.notify_url);
alipayRequest.setBizContent(content);
//請求
String result = alipayClient.pageExecute(alipayRequest).getBody();
return result;
}
2.4這時候就會在網頁讓你打開支付寶 進行支付
效果圖
2.5支付成功回調接口 接口必須對外開放能在公網通路到 這是阿裡雲調用你的接口
@ApiOperation(value = "H5支付支付寶回調", notes = "H5支付支付寶回調")
@PostMapping(value = "/aliCallback")
@UnAuthentication
public JsonResult aliCallback(HttpServletRequest request) throws AlipayApiException {
System.out.println("/aliCallback進入支付寶PC異步回調");
Map<String, String> params = new HashMap<String, String>();
//從支付寶回調的request域中取值
Map<String, String[]> requestParams = request.getParameterMap();
for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
String name = iter.next();
String[] values = requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
}
// 亂碼解決,這段代碼在出現亂碼時使用。如果mysign和sign不相等也可以使用這段代碼轉化
// valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
params.put(name, valueStr);
}
System.out.println(request.toString());
System.out.println(params.toString());
//商品訂單号
String out_trade_no = request.getParameter("out_trade_no"); // 商戶訂單号
String trade_no = request.getParameter("trade_no"); // 流水号
System.out.println(out_trade_no);
// 目前交易狀态
String tradeStatus = request.getParameter("trade_status"); //交易狀态
// 支付金額
String totalAmount = request.getParameter("total_amount"); //交易狀态
// 支付時間
String payDate = request.getParameter("gmt_payment"); //交易狀态
//3.簽名驗證(對支付寶傳回的資料驗證,确定是支付寶傳回的)
boolean signVerified = AlipaySignature.rsaCheckV1(params, PayConfig.ZFB_PUBLIC_ID, PayConfig.CHARSET,
PayConfig.SIGN_TYPE);
if (signVerified) {
System.out.println("驗簽通過");
//驗簽通過
if (tradeStatus.equals("TRADE_SUCCESS")) {
//支付成功後的業務處理
System.out.println("TRADE_SUCCESS");
return payService.notifyPcOrder(out_trade_no, trade_no);
}
} else { //驗簽不通過
System.out.println("驗證失敗");
return new JsonResult().setSuccess(false).setMsg("驗證失敗");
}
System.out.println("支付失敗");
return new JsonResult().setSuccess(false).setMsg("支付失敗");
}
2.6退款接口
3.uniapp支付
uni.request({
url: '後端支付下單接口位址',
method: 'POST',
success: (res)=>{
// 将接口傳回的form表單顯示到頁面
document.querySelector('body').innerHTML = res.data;
// 調用submit方法
document.forms[0].submit()
}
});2