- 一 前提條件
- 開發平台注冊: 地址:https://openhome.alipay.com
- 創建應用: 開發者中心 ➡ 選擇你對接的類型(我這里是網頁&移動應用)➡ 創建應用
- 完善應用:
a、添加功能:app支付
b、簽約
c、開發設置:應用信息里設置 接口加簽方式 等
4. 申請上線:提交申請,大概需要一天時間審核
- 二 SDK下載
1、選擇相應的語言下載即可,地址: https://docs.open.alipay.com/54/103419/
2、配置pom文件
- 三 代碼
1、 發起支付接口
/** * 支付寶支付 * @param payRecord * @return */ public MapResult aliPay(PayRecord payRecord){ //實例化客戶端 AlipayClient alipayClient = AliPayUtils.getAlipayClient(); //實例化具體API對應的request類,類名稱和接口名稱對應,當前調用接口名稱:alipay.trade.app.pay AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest(); //SDK已經封裝掉了公共參數,這里只需要傳入業務參數。以下方法為sdk的model入參方式(model和biz_content同時存在的情況下取biz_content)。 AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); //model.setBody("我是測試數據"); model.setSubject("玉米出行-油券"); model.setOutTradeNo(payRecord.getId()); model.setTimeoutExpress("10m"); model.setTotalAmount(payRecord.getPayMoney().toString()); model.setProductCode("QUICK_MSECURITY_PAY"); request.setBizModel(model); request.setNotifyUrl(notifyUrlAliPay); String orderString = ""; try { //這里和普通的接口調用不同,使用的是sdkExecute AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request); orderString = response.getBody(); System.out.println(response.getBody());//就是orderString 可以直接給客戶端請求,無需再做處理。 } catch (AlipayApiException e) { e.printStackTrace(); } return MapResult.build(orderString); }
2、AliPayUtils工具類
/** * 2019/10/12 12:10 PM * * @author shoo * @describe 支付寶支付 */ public class AliPayUtils { public static final String APP_ID = "2019100912345678"; /** * 應用公鑰 */ public static final String APP_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ"; /** * 支付寶公鑰 */ public static final String ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w"; public static final String APP_PRIVATE_KEY = "MIIEvwIBADANBgkqhkiG9w0BAQEFAA"; public static final String SIGN_TYPE = "RSA2"; public static final String CHARSET = "UTF-8"; public static final String GATEWAY = "https://openapi.alipay.com/gateway.do"; public static AlipayClient getAlipayClient(){ AlipayClient alipayClient = new DefaultAlipayClient(GATEWAY,APP_ID,APP_PRIVATE_KEY,"json", CHARSET, APP_PUBLIC_KEY, SIGN_TYPE); return alipayClient; } }
3、支付成功后異步回調
/** * 支付寶回調 * */ @PostMapping("/aliPay") public String aliPay(HttpServletRequest request){ Map<String, String> params = convertRequestParamsToMap(request); // 將異步通知中收到的待驗證所有參數都存放到map中 String paramsJson = JSON.toJSONString(params); logger.info("支付寶回調,{}", paramsJson); try { //驗簽 boolean signVerify = AlipaySignature.rsaCheckV1(params, AliPayUtils.ALIPAY_PUBLIC_KEY, AliPayUtils.CHARSET,AliPayUtils.SIGN_TYPE); if(signVerify){ //todo 嚴格來說,這里還應該做訂單號、金額等校驗 String out_trade_no = (String) params.get("out_trade_no");//本系統付款ID String trade_no = (String) params.get("trade_no");//淘寶系統中的交易流水號 //完成支付后的后續動作 updateOrder(out_trade_no, trade_no); }else{ logger.info("---支付寶回調,驗簽異常,param:[{}]" , paramsJson); return "fail"; } }catch (Exception ex){ ex.printStackTrace(); return "fail"; } return "success"; } // 將request中的參數轉換成Map private static Map<String, String> convertRequestParamsToMap(HttpServletRequest request) { Map<String, String> retMap = new HashMap<>(); Set<Map.Entry<String, String[]>> entrySet = request.getParameterMap().entrySet(); for (Map.Entry<String, String[]> entry : entrySet) { String name = entry.getKey(); String[] values = entry.getValue(); int valLen = values.length; if (valLen == 1) { retMap.put(name, values[0]); } else if (valLen > 1) { StringBuilder sb = new StringBuilder(); for (String val : values) { sb.append(",").append(val); } retMap.put(name, sb.toString().substring(1)); } else { retMap.put(name, ""); } } return retMap; }