1. 程式人生 > >支付寶--掃碼支付流程

支付寶--掃碼支付流程

1.首次知道,原來(支付寶支付介面)需要去螞蟻金服開發者幫助文件(尷尬)。

2.建立自己的應用,我選的是【自研接入】(這是一個坑,如果不是企業級應用,不能簽約,所有掃碼支付功能並不能使用),建立應用的時候選擇【支付接入】

3.有一個很坑爹的步驟:上傳圖示的時候,在螢幕的最右邊有一個編輯按鈕(我的天,我還以為我發現支付寶的一個BUG呢)

(注:上傳圖示要注意(不能為人物和動物頭像))

4.生成RSA 金鑰,下載支付提供的工具(windows 和 mac 倆個版本),生成以後,點選工具右下角有一個上傳公鑰,這裡我詳細的說一下,一共有三個(倆個是我們自己生成的,公鑰,私鑰,這倆個上傳之後會生成一個支付的公鑰)。

5.所有之前的都是準備工作,下面才是重頭戲,支付寶提供的是SDK,但是我們使用的是maven 搭建的spring-boot專案,所以我們先找一下有沒有支付寶maven 依賴。 

<!--支付寶支付SDK-->
<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>3.4.27.ALL</version>
</dependency>

6.在這裡我還要提一下,我自己要做的事情,是支付寶掃碼支付,所以我貼上一張支付流程圖

支付寶掃碼支付流程圖
支付寶掃碼支付流程圖

7.本地如果想呼叫第三方介面,需要有自己的域名,或者配置內網穿透(我下載的是花生殼,想必大家都聽說過哈 ,當然也不是免費的 6塊大洋)

8.我們要呼叫第三方的介面,需要組裝對應的AlipayTradePrecreateRequest請求 

9.然後呼叫支付寶的響應請求AlipayTradePrecreateResponse ,下單(這個單官方已經給您解釋了,按照人家規定的組裝就可以了)

10.擷取一些比較重要的程式碼環節

常用引數配置類

public class AlipayConfig {
    //ServiceURL 設定閘道器
    public static String ServiceUrl="https://openapi.alipay.com/gateway.do";
    //APP支付寶支付業務:app_id
    public static String app_id = "你的專案APPID";//例:2016082600317257
    // 商戶的私鑰,使用支付寶自帶的openssl工具生成。
    public static String private_key = "你的私鑰";
    // 應用的公鑰,無需修改該值
    public static String ali_public_key = "";
    // 支付寶的公鑰,去open.alipay.com對應應用下檢視。
    public static String zfb_public_key="";
    // 字元編碼格式 目前支援 gbk 或 utf-8
    public static String input_charset = "UTF-8";
}

二維碼生成 Controller

   @RequestMapping(value="/alipay")
    @ApiOperation(value = "支付寶支付--下訂單--返回二維碼資料流")
    public String  ailipay(@RequestParam @ApiParam(required = true,name = "車牌號碼") String licensePlateNumber,HttpServletResponse servletResponse) throws AlipayApiException {
        // 拼裝客戶端
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.ServiceUrl,AlipayConfig.app_id,
                AlipayConfig.private_key,"json",AlipayConfig.input_charset,AlipayConfig.zfb_public_key,"RSA2");
        // 支付寶 request
        AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
        String subject = "華安停車支付寶支付測試";
        String totalAmount = "0.01";
        String storeId = "123";
        AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
        model.setSubject(subject);
        model.setTotalAmount(totalAmount);
        model.setStoreId(storeId);
        model.setTimeoutExpress("5m");
        //商品訂單號碼 out_trade_no 商戶訂單號,64個字元以內、只能包含字母、數字、下劃線;需保證在商戶端不重複
        model.setOutTradeNo(UUID.randomUUID().toString());
        request.setBizModel(model);
        //request.set
        // 支付寶 response 這裡已經對相應結果解析了。返回值
        AlipayTradePrecreateResponse response = alipayClient.execute(request);
        if(response.isSuccess()){
            System.out.println("呼叫成功");
            String code = response.getQrCode();
            //二維碼資料流
            System.out.println(code);
            ZxingUtils.writeToServletFile(code,servletResponse);
        } else {
            System.out.println("呼叫失敗");
        }
        return "Success";
    }

支付寶的二維碼需要自己生成的,官方下載的Demo中也有Zxing的工具類(我改良了一下,主要是用於web頁面顯示二維碼)

public static void writeToServletFile(String contents, HttpServletResponse resp){
    try {
        Map<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
        hints.put(EncodeHintType.CHARACTER_SET, "UTF8");
        BitMatrix bitMatrix = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE,
                200, 200, hints);
        MatrixToImageWriter.writeToStream(bitMatrix, "png", resp.getOutputStream());
    } catch (Exception e) {
        e.printStackTrace();
    }

}

這是Zxing所需要的 maven 依賴

       <!-- Zxing 二維碼生成器 -->
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.3.3</version>
        </dependency>
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>javase</artifactId>
            <version>3.2.0</version>
        </dependency>

頁面可以用img標籤就可以接受我們轉換的流檔案(inputStream)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>測試二維碼生成</title>
</head>
<body>
    <h1>
        測試二維碼生成
    </h1>
    //這個地址是我通過花生殼轉換過的域名
    <img src="http://2259b3c617.iok.la/pay/alipay?licensePlateNumber=12">
</body>
</html>

我們看一下頁面展示效果

最後我們需要寫一下支付成後以後的回撥用地址(這裡面有一個驗籤的過程提供很多種方法)

    /**
     * @Author : wangjian
     * @Description 支付回掉URL
     * @Date  2018/11/5 14:31
     * @Param [licensePlateNumber]
     * @Return java.lang.String
     **/
    @RequestMapping("/aliPayCallBack")
    public String aliPayCallBack(HttpServletResponse response, HttpServletRequest request){
        try {
            Map<String,String> params = new HashMap<String,String>();
            Map requestParams = request.getParameterMap();
            for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
                String name = (String) iter.next();
                String[] values = (String[]) requestParams.get(name);
                String valueStr = "";
                for (int i = 0; i < values.length; i++) {
                    valueStr = (i == values.length - 1) ? valueStr + values[i]
                            : valueStr + values[i] + ",";
                }
                //亂碼解決,這段程式碼在出現亂碼時使用。
                //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
                params.put(name, valueStr);
            }
            boolean flag = AlipaySignature.rsaCheckV1(params, AlipayConfig.zfb_public_key, AlipayConfig.input_charset,"RSA2");
            String trade_status = request.getParameter("trade_status"); // 交易狀態

            String order_no = request.getParameter("out_trade_no"); // 獲取訂單號
            log.info("回撥過程獲取的訂單編號:{}" ,order_no);
            // 獲取支付寶的通知返回引數,可參考技術文件中頁面跳轉同步通知引數列表(以上僅供參考)//
            if (flag==true) {// 驗證成功
                System.out.println("支付寶訂單支付成功!");
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("支付異常^-^");
        }
        return "";
    }

最後還要稍微提一下,支付寶的沙箱測試(個人認為這也是比微信支付更牛逼的地方)

沙箱環境:在我理解看來就是一個模擬支付的流程(裡面可以模擬各種支付)

1.需要下載對應的支付寶APP(文件上有二維碼,當然目前只支援安卓手機下載)

2.下載好對應的APP以後,需要在支付寶開發裡再次上傳一下自己的公鑰,然後獲取支付寶對應的公鑰,重新分配一個APPID,

支付寶網關同時也需要改(後面加了一個dev ),看好喲。

3.改完之後就可以隨便測試了

好了,以上就是支付寶的掃碼支付的全部流程了,完成了簡單的支付流程,當然所有的程式碼都是擼在controller中,也沒有連線

資料庫,我是以一個小白的來自這件事情的,希望後續有人看了會對你有所幫助。