JAVA服務端集成APP支付寶支付

因為公司項目需要集成支付寶支付,所以這次我把我集成支付寶支付的過程記錄一下

1接入準備

接入準備:https://opensupport.alipay.com/support/helpcenter/190/201602469553?ant_source=antsupport
支付寶的開發(fā)文檔里的接入準備寫的很詳細烙丛,根據開發(fā)文檔一步步來就可以了

2服務端demo

我先放一下主要系統(tǒng)交互圖


image.png

我的理解服務端要做的事就是
1倍谜、準備好支付寶需要的各種參數傳入到支付寶給的接口中小压,然后支付寶返回給你支付請求玉工。然后IOS或者安卓獲取這串支付請求去調起支付寶的收銀界面,如果可以正常調起汁胆,那說明這一步沒問題梭姓。
2、支付完成后支付寶會去調用你設置的異步回調接口嫩码,你需要在回調接口中判斷用戶是否支付完成

首先我們先引入支付寶的依賴

        <!--添加支付寶的依賴-->
        <dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>4.8.10.ALL</version>
        </dependency>

服務端官網的開發(fā)文檔:https://opendocs.alipay.com/open/54/106370/

    private final static String APP_ID = "你的支付寶APPID";

    private final static String APP_PRIVATE_KEY = "你的應用私鑰";

    private final static String CHARSET = "UTF-8";

    private final static String ALIPAY_PUBLIC_KEY = "";

    private final static String URL = "https://openapi.alipay.com/gateway.do";

    private static String CER_PATH = "/opt/aliPay/";  //服務器支付寶證書

//    private static String CER_PATH="E:\\ALiPayCert\\";  //本地Windows測試路徑

 /**
     * JAVA服務端 SDK 生成 APP支付訂單息
     */
    public static String generatePayOrderInformation() throws AlipayApiException {
        //構造client
        CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
        //設置網關地址
        certAlipayRequest.setServerUrl(URL);
        //設置應用Id
        certAlipayRequest.setAppId(APP_ID);
        //設置應用私鑰
        certAlipayRequest.setPrivateKey(APP_PRIVATE_KEY );
        //設置請求格式糊昙,固定值json
        certAlipayRequest.setFormat("json");
        //設置字符集
        certAlipayRequest.setCharset(CHARSET);
        //設置簽名類型
        certAlipayRequest.setSignType("RSA2");
        //設置應用公鑰證書路徑
        certAlipayRequest.setCertPath(CER_PATH+"你的應用公鑰證書路徑");
        //設置支付寶公鑰證書路徑
        certAlipayRequest.setAlipayPublicCertPath(CER_PATH+"你的支付寶公鑰證書路徑");
        //設置支付寶根證書路徑
        certAlipayRequest.setRootCertPath(CER_PATH+"你的支付寶根證書路徑");
        //構造client
        AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);

        //實例化具體API對應的request類,類名稱和接口名稱對應,當前調用接口名稱:alipay.trade.app.pay
        AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
        //SDK已經封裝掉了公共參數,這里只需要傳入業(yè)務參數谢谦。以下方法為sdk的model入參方式(model和biz_content同時存在的情況下取biz_content)释牺。
        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
        model.setBody("這是一雙鞋子");  //對一筆交易的具體描述信息
        model.setSubject("鞋子");  //商品的標題/交易標題/訂單標題/訂單關鍵字等
        model.setOutTradeNo("1231231");  //商戶網站唯一訂單號
        model.setTimeoutExpress(30m);  //該筆訂單允許的最晚付款時間,逾期將關閉交易回挽。取值范圍:1m~15d没咙。m-分鐘,h-小時千劈,d-天祭刚,1c-當天(1c-當天的情況下,無論交易何時創(chuàng)建,都在0點關閉)涡驮。該參數數值不接受小數點暗甥,如 1.5h,可轉換為 90m捉捅。
        model.setTotalAmount(100);  //訂單總金額撤防,單位為元,精確到小數點后兩位
        model.setProductCode("QUICK_MSECURITY_PAY");   //銷售產品碼棒口,商家和支付寶簽約的產品碼寄月,APP支付功能中該值固定為:QUICK_MSECURITY_PAY
        request.setBizModel(model);
        request.setNotifyUrl("http://你的回調路徑/aliPaySuccess");//商戶外網可以訪問的異步地址
        try {
            //這里和普通的接口調用不同,使用的是sdkExecute
            AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
            System.out.println(response.getBody());//就是orderString 可以直接給客戶端請求无牵,無需再做處理漾肮。
            return response.getBody();
        } catch (AlipayApiException e) {
            e.printStackTrace();
            return null;
        }
    }

我這里接口加簽方式選擇的是公鑰證書如果你選擇的是普通公鑰方式應該只需要把公鑰跟私鑰傳入代碼即可。上面獲取的response.getBody()就是傳給客戶端的支付請求茎毁,如果客戶端可以調出支付寶的收銀臺說明代碼沒問題克懊。我們也可以使用支付寶給的調試工具進行調試
調試工具:https://openclub.alipay.com/club/history/read/7695
截下來我們就要編寫上面我們設置的異步回調接口的代碼

    /***
     * 支付寶成功回調
     * @param request
     * @return
     * @throws Exception
     */
    @RequestMapping("aliPaySuccess")
    public Object aliPaySuccess(HttpServletRequest request) {
        Map<String, Object> map = new HashMap<>();
        try {
            Map<String, String> params = new HashMap<>();
            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);
            }
            String orderNumber = request.getParameter("out_trade_no");      //獲取訂單號
            String total_amount = request.getParameter("total_amount");     //獲取總金額
            String trade_status = request.getParameter("trade_status");     //交易狀態(tài)
            if(trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")){
                //判斷該筆訂單是否在商戶網站中已經做過處理(可參考“集成教程”中“3.4返回數據處理”)
                //如果沒有做過處理保檐,根據訂單號(out_trade_no)在商戶網站的訂單系統(tǒng)中查到該筆訂單的詳細,并執(zhí)行商戶的業(yè)務程序
                //如果有做過處理崔梗,不執(zhí)行商戶的業(yè)務程序
                System.out.println("================================交易狀態(tài)為:"+trade_status+"====================================");
                System.out.println("================================訂單編號為:"+orderNumber+"====================================");
                System.out.println("================================訂單金額為:"+total_amount+"====================================");
                //支付成功后進行修改訂單等操作

                return "SUCCESS";
            } else {
                map.put("returnValue", 2);
                map.put("errMsg", "訂單未支付完成");
                System.out.println("================================訂單未支付完成====================================");
                return map;
            }
        }catch (Exception e){
            e.printStackTrace();
            map.put("returnValue", 99);
            map.put("errMsg", "系統(tǒng)錯誤,請不要違法垒在。");
            System.out.println("================================系統(tǒng)錯誤====================================");
            return map;
        }
    }

官網文檔:https://opendocs.alipay.com/open/204/105301/#s1

image.png

測試結果在控制臺打印出來蒜魄,金額,訂單號跟我們創(chuàng)建的訂單一樣說明服務端集成支付寶支付就算成功了场躯!

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末谈为,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子踢关,更是在濱河造成了極大的恐慌伞鲫,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件签舞,死亡現場離奇詭異秕脓,居然都是意外死亡,警方通過查閱死者的電腦和手機儒搭,發(fā)現死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門吠架,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人搂鲫,你說我怎么就攤上這事傍药。” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵拐辽,是天一觀的道長拣挪。 經常有香客問我,道長俱诸,這世上最難降的妖魔是什么菠劝? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮乙埃,結果婚禮上闸英,老公的妹妹穿的比我還像新娘。我一直安慰自己介袜,他們只是感情好甫何,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著遇伞,像睡著了一般辙喂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鸠珠,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天巍耗,我揣著相機與錄音,去河邊找鬼渐排。 笑死炬太,一個胖子當著我的面吹牛,可吹牛的內容都是我干的驯耻。 我是一名探鬼主播亲族,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼可缚!你這毒婦竟也來了霎迫?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤帘靡,失蹤者是張志新(化名)和其女友劉穎知给,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體描姚,經...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡涩赢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了轩勘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谒主。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖赃阀,靈堂內的尸體忽然破棺而出霎肯,到底是詐尸還是另有隱情擎颖,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布观游,位于F島的核電站搂捧,受9級特大地震影響,放射性物質發(fā)生泄漏懂缕。R本人自食惡果不足惜允跑,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望搪柑。 院中可真熱鬧聋丝,春花似錦、人聲如沸工碾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渊额。三九已至况木,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間旬迹,已是汗流浹背火惊。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奔垦,地道東北人屹耐。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像椿猎,于是被迫代替她去往敵國和親惶岭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348