支付寶對接-java后端

前段時間许赃,公司需要接入支付寶,現(xiàn)在騰出了一點時間旅东,所以做一下總結(jié)男娄,分享一些自己項目中遇到的坑行贪,本文
app支付為例。對于支付寶的對接模闲,無疑官方文檔是最全建瘫,最完善的,所以給大家一個傳送 

支付寶官方文檔
1.創(chuàng)建應用并獲取APPID
2.配置應用


集成開發(fā)

本文使用支付寶sdk進行支付寶對接尸折,請到支付寶java demo進行下載

1.參數(shù)說明

FireShot Capture 2 - 開放平臺文檔中心 - https___docs.open.alipay.com_204_105465_.png

2.APP客戶端請求orderString的生成

 // 請求網(wǎng)關地址
    public static final String ALIPAY_URL = "https://openapi.alipay.com/gateway.do";
 // 異回調(diào)地址
    public static final String ALIPAY_NOTIFY_URL = "https://www.nickbi.com/alipay/notify";
 // 商戶appid
    public static final String ALIPAY_APPID = "xxxxxx";
// 私鑰 pkcs8格式的(可用支付寶秘鑰工具生成)
    public static final String ALIPAY_RSA_PRIVATE_KEY = “xxxxx”
 // 返回格式
    public static final String ALIPAY_ALI_FORMAT = "json";
 // 返回格式
    public static final String ALIPAY_ALI_FORMAT = "json";
// 支付寶公鑰(可在設置了公鑰私鑰后啰脚,在支付寶商戶后臺查看)
    public static final String ALI_PUBLIC_KEY = “xxxxx”
// RSA2
    public static final String ALIPAY_SIGNTYPE = "RSA2";

 /**
  * 獲得app端支付寶參數(shù)
  */
    public String getAlipayReqeustString(String orderNo, String totalAmount)
            throws AlipayApiException {
        //app Request
        AlipayClient alipayClient = new DefaultAlipayClient(ALIPAY_URL,
                ALIPAY_APPID, ALIPAY_RSA_PRIVATE_KEY, ALIPAY_ALI_FORMAT,
               ALIPAY_CHARSET,  ALI_PUBLIC_KEY,ALIPAY_SIGNTYPE);
        //實例化具體API對應的request類,類名稱和接口名稱對應,當前調(diào)用接口名稱:alipay.trade.app.pay
        AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
        //SDK已經(jīng)封裝掉了公共參數(shù),這里只需要傳入業(yè)務參數(shù)实夹。以下方法為sdk的model入?yún)⒎绞?model和biz_content同時存在的情況下取biz_content)橄浓。
        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
        //model.setBody(body);
        model.setSubject(“簡書打賞”);
        model.setOutTradeNo(orderNo);
        //訂單超時時間:取值范圍:1m~15d粒梦。m-分鐘,h-小時荸实,d-天匀们,1c-當天
        model.setTimeoutExpress(“30m”);
       //訂單總支付金額
        model.setTotalAmount(totalAmount);
       //銷售產(chǎn)品碼:商家和支付寶簽約的產(chǎn)品碼,為固定值QUICK_MSECURITY_PAY
        model.setProductCode("QUICK_MSECURITY_PAY");
        request.setBizModel(model);
        request.setNotifyUrl(ALIPAY_NOTIFY_URL);
        //這里和普通的接口調(diào)用不同准给,使用的是sdkExecute
        AlipayTradeAppPayResponse response =  alipayClient.sdkExecute(request);
        return response.getBody();//就是orderString 可以直接給客戶端請求昼蛀,無需再做處理。
    }

3.回調(diào)處理

    @ResponseBody
    @RequestMapping(value = "/alipay/notify", method = RequestMethod.POST)
    public String getPayNotify(HttpServletRequest request) throws Exception {
        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] + ",";
            }
            //亂碼解決圆存,這段代碼在出現(xiàn)亂碼時使用叼旋。如果mysign和sign不相等也可以使用這段代碼轉(zhuǎn)
            // valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
            params.put(name, valueStr);
}
        //獲取支付寶的通知返回參數(shù),可參考技術(shù)文檔中頁面跳轉(zhuǎn)同步通知參數(shù)列表(以下僅供參考)//
        // 商戶訂單號
        String out_trade_no = new String(
                request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");

        //支付寶交易號
        String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),
                "UTF-8");
        //支付金額
        String total_fee = "0.00";
        if (request.getParameter("total_amount") != null) {
            total_fee = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"),
                    "UTF-8");
        }

        //交易狀態(tài)
        String trade_status = new String(
                request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");

        //異步通知ID
        String notify_id = request.getParameter("notify_id");

        if (notify_id != null && !"".equals(notify_id)) {
            boolean verify_result = AlipaySignature
                    .rsaCheckV1(params, ALI_PUBLIC_KEY, AppContents.ALI_CHARSET,
                            ALIPAY_SIGNTYPE);
            if (verify_result) {
                //使用支付寶公鑰驗簽
                //訂單支付成功
                //if (trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")) {
                if (trade_status.equals("TRADE_SUCCESS")) {
                //業(yè)務處理,使用自己的接口沦辙,進行訂單處理
                    boolean result = orderService.getNotify(......)
                    if (result) {
                        return "success";
                    }
                }
                //訂單超時關閉夫植,修改訂單
                if (trade_status.equals("TRADE_CLOSED")) {
                    boolean result = orderService.getCloseNotify(......)
                    if (result) {
                        return "success";
                    }
                }
                return "fail";
            } else {
                //驗證簽名失敗
                return "fail";
            }

        } else {
            return "fail";
        }
    }

總結(jié)

遇到的一些坑:

在項目的前期,使用app端的同步回調(diào)去處理訂單信息油讯,但是由于用戶操作的確定性详民,所以在回調(diào)過程中會出現(xiàn)很多
意向不到的結(jié)果,所以訂單處理異步回調(diào)更穩(wěn)妥(老哥如果覺得想飆車陌兑,去試一把那我也是不拒絕的)沈跨。另外對于異步
回調(diào)也會出現(xiàn)未知原因,所以關于訂單的輪詢查詢兔综,訂單矯正請自行嘗試饿凛,到時可以一起交流下。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末软驰,一起剝皮案震驚了整個濱河市涧窒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锭亏,老刑警劉巖纠吴,帶你破解...
    沈念sama閱讀 223,207評論 6 521
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異慧瘤,居然都是意外死亡戴已,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,455評論 3 400
  • 文/潘曉璐 我一進店門锅减,熙熙樓的掌柜王于貴愁眉苦臉地迎上來糖儡,“玉大人,你說我怎么就攤上這事上煤⌒萃妫” “怎么了?”我有些...
    開封第一講書人閱讀 170,031評論 0 366
  • 文/不壞的土叔 我叫張陵,是天一觀的道長拴疤。 經(jīng)常有香客問我永部,道長,這世上最難降的妖魔是什么呐矾? 我笑而不...
    開封第一講書人閱讀 60,334評論 1 300
  • 正文 為了忘掉前任苔埋,我火速辦了婚禮,結(jié)果婚禮上蜒犯,老公的妹妹穿的比我還像新娘组橄。我一直安慰自己,他們只是感情好罚随,可當我...
    茶點故事閱讀 69,322評論 6 398
  • 文/花漫 我一把揭開白布玉工。 她就那樣靜靜地躺著,像睡著了一般淘菩。 火紅的嫁衣襯著肌膚如雪骨望。 梳的紋絲不亂的頭發(fā)上涤伐,一...
    開封第一講書人閱讀 52,895評論 1 314
  • 那天蜻牢,我揣著相機與錄音罪既,去河邊找鬼。 笑死汇在,一個胖子當著我的面吹牛翰萨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播糕殉,決...
    沈念sama閱讀 41,300評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼亩鬼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了糙麦?” 一聲冷哼從身側(cè)響起辛孵,我...
    開封第一講書人閱讀 40,264評論 0 277
  • 序言:老撾萬榮一對情侶失蹤丛肮,失蹤者是張志新(化名)和其女友劉穎赡磅,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宝与,經(jīng)...
    沈念sama閱讀 46,784評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡焚廊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,870評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了习劫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咆瘟。...
    茶點故事閱讀 40,989評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖诽里,靈堂內(nèi)的尸體忽然破棺而出袒餐,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,649評論 5 351
  • 正文 年R本政府宣布灸眼,位于F島的核電站卧檐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏焰宣。R本人自食惡果不足惜霉囚,卻給世界環(huán)境...
    茶點故事閱讀 42,331評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望匕积。 院中可真熱鬧盈罐,春花似錦、人聲如沸闪唆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,814評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悄蕾。三九已至湾揽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間笼吟,已是汗流浹背库物。 一陣腳步聲響...
    開封第一講書人閱讀 33,940評論 1 275
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贷帮,地道東北人戚揭。 一個月前我還...
    沈念sama閱讀 49,452評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像撵枢,于是被迫代替她去往敵國和親民晒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,995評論 2 361

推薦閱讀更多精彩內(nèi)容