支付寶對接步驟 (app)


 

  • 一 前提條件
  1. 開發平台注冊: 地址:https://openhome.alipay.com
  2. 創建應用: 開發者中心 ➡ 選擇你對接的類型(我這里是網頁&移動應用)➡ 創建應用
  3. 完善應用:

            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;
    }

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM