1. 程式人生 > >支付寶APP支付Java服務端

支付寶APP支付Java服務端

這裡對於設定支付寶賬號和配置就不做說明,網上很多配置資訊和應用上線的文章
做第三方介面首先得看官方文件,支付寶的官方文件非常清晰:
這裡寫圖片描述
首先登入支付寶的開放文件,下載支付寶SDK和demo,連結:
https://docs.open.alipay.com/54/106370/
將jar包匯入專案,在Java服務端生成訂單資訊:

//例項化客戶端
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2"
); //例項化具體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("App支付測試Java"); model.setOutTradeNo(outtradeno);//更換為自己的訂單編號 model.setTimeoutExpress("30m"); model.setTotalAmount("0.01");//訂單價格 model.setProductCode("QUICK_MSECURITY_PAY"); request.setBizModel(model); request.setNotifyUrl("商戶外網可以訪問的非同步地址");//回撥地址不可以帶引數 String orderStr = ""; try { //這裡和普通的介面呼叫不同,使用的是sdkExecute AlipayTradeAppPayResponse response = alipayClient.sdkExecute
(request); orderStr = response.getBody(); System.out.println(orderStr);//就是orderString 可以直接給客戶端請求,無需再做處理。 } catch (AlipayApiException e) { e.printStackTrace(); }

說的簡直太詳細,只需要替換自己的訂單ID和價格就可以了,這裡我們只需要把orderStr返回給客戶端就可以了,我是通過json返回的,當然客戶端完成支付之後,服務端還需要知道支付結果,或者將支付的訂單資訊存入資料庫,那麼我們需要設定回撥地址,即setNotifyUrl,支付寶服務端通過這個地址將支付結果返回給後臺服務端,在這裡我們可以更改訂單狀態,插入訂單資訊等等。(注:這個的回撥地址必須是外網可以訪問的,不然收不到支付寶返回的資訊,這個地址即我們在開發配置中設定的授權回撥地址)
這裡寫圖片描述

回撥頁面內容嚴格按照支付寶規定:

<%@ page language="java" contentType="text/html; charset=gbk" pageEncoding="gbk"%>
<%@page  import="com.alipay.api.internal.util.AlipaySignature"%>
<%@ page import="java.util.*"%>
<%@ page import="java.util.Map"%>
<%@ page import="com.alipay.*"%>
<%@ page import="com.alipay.api.*"%>

<%

    //獲取支付寶POST過來反饋資訊
    Map<String,String> params = new HashMap<String,String>();
    System.out.println("非同步通知引數:");
    Map<String,String[]> requestParams  = request.getParameterMap();
    for (Iterator<String> 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] + ",";
        }
        if(name.equals("trade_status")){

        System.out.println("交易狀態為:"+valueStr);

        }
        //亂碼解決,這段程式碼在出現亂碼時使用。如果mysign和sign不相等也可以使用這段程式碼轉化
        //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
        params.put(name, valueStr);
    }
    System.out.println("params"+params);
    String pk = "自己的支付寶公鑰";
    //獲取支付寶的通知返回引數
        //商戶訂單號
        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 auth_app_id = new String(request.getParameter("auth_app_id").getBytes("ISO-8859-1"),"UTF-8");
        //買家登入支付寶id
        String buyer_logon_id = new String(request.getParameter("buyer_logon_id").getBytes("ISO-8859-1"),"UTF-8");
        //交易時間
        String gmt_payment = new String(request.getParameter("gmt_payment").getBytes("ISO-8859-1"),"UTF-8");
        //交易金額
        String invoice_amount = new String(request.getParameter("invoice_amount").getBytes("ISO-8859-1"),"UTF-8");


        boolean verify_result = AlipaySignature.rsaCheckV1(params,pk, "UTF-8", "RSA2");

        //這裡可以做處理修改訂單狀態

        if(verify_result){//驗證成功

    //支付成功只需要返回success

            System.out.println(1);
            out.println("success"); //請不要修改或刪除

        }else{//驗證失敗
        System.out.println(2);
            out.println("fail");
        }
%>

需要修改訂單狀態時在回撥頁面根據out_trade_no改變訂單狀態就可以。