支付寶Wap支付你了解多少?

上幾篇文章詳細(xì)介紹了支付寶APP支付微信APP支付

此文章來介紹下支付寶Wap支付(也叫作手機(jī)網(wǎng)站支付)

目錄
1、創(chuàng)建應(yīng)用并獲取APPID
2、配置應(yīng)用環(huán)境
3、配置沙箱環(huán)境
4、服務(wù)端實(shí)現(xiàn)(Maven添加本地Jar包、集成并配置SDK)

先上官方文檔入口,支付寶文檔入口模仿微信最最近做了更新,變得更簡潔明了。

官方手機(jī)網(wǎng)站支付快速接入文檔

1、創(chuàng)建應(yīng)用并獲取APPID

這個(gè)比較簡單可以參考《開放平臺應(yīng)用創(chuàng)建指南》

2、配置應(yīng)用環(huán)境

開發(fā)者調(diào)用接口前需要先生成RSA密鑰,RSA密鑰包含應(yīng)用私鑰(APP_PRIVATE_KEY)、應(yīng)用公鑰(APP_PUBLIC_KEY)。生成密鑰后在開放平臺管理中心進(jìn)行密鑰配置,配置完成后可以獲取支付寶公鑰(ALIPAY_PUBLIC_KEY)。詳細(xì)步驟請參考《配置應(yīng)用環(huán)境》。

為了方便開發(fā)者生成一對RSA密鑰支付寶提供一鍵生成工具,具體如何生成與配置密鑰詳見簽名專區(qū)。

WINDOWS
MAC_OSX

下載該工具后,解壓打開文件夾,運(yùn)行“RSA簽名驗(yàn)簽工具.bat”(WINDOWS)或“RSA簽名驗(yàn)簽工具.command”(MAC_OSX)。

以下演示截圖

Window 配置應(yīng)用環(huán)境生成相關(guān)Key截圖參考上篇文檔支付寶APP支付

以下是Mac電腦生成RSA密鑰工具截圖

Mac 生成RSA密鑰工具.png
生成密鑰.png

工具生成一對RSA密鑰之后將公鑰配置到應(yīng)用環(huán)境。
生成的私鑰需妥善保管,避免遺失,不要泄露。應(yīng)用私鑰需填寫到代碼中供簽名時(shí)使用。應(yīng)用公鑰需提供給支付寶賬號管理者上傳到支付寶開放平臺。

上傳支付寶公鑰.png

3、配置沙箱環(huán)境

注意:沙箱環(huán)境的密鑰最好與正式上線的應(yīng)用進(jìn)行區(qū)分避免一些不必要的麻煩。WAP支付支持沙箱環(huán)境而app支付不支持沙箱環(huán)境

官方介紹質(zhì)料-箱環(huán)境使用說明

上傳對應(yīng)的公鑰,沙箱賬號待會(huì)在測試的時(shí)候回使用到

沙箱環(huán)境配置.png
沙箱工具.png

4、服務(wù)端實(shí)現(xiàn)(集成并配置SDK)

官方資源下載地址

服務(wù)端SDK下載與簡介
服務(wù)端SDK下載
服務(wù)端SDK
SDK包說明
Maven項(xiàng)目中使用本地JAR包

1、首先我在項(xiàng)目根目錄中創(chuàng)建一個(gè)lib文件夾,將jar包拷貝到lib文件夾下

添加jar包

2、然后我們在maven的pom.xml中配置

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>20161129201425</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/lib/alipay-sdk-java20161129201425.jar</systemPath>
</dependency>

3、這里的groupId和artifactId以及version都是可以隨便填寫的 ,scope必須填寫為system,而systemPath我們現(xiàn)在我們jar包的地址就可以了

4、最后我們必須在maven打包的過程中加入我們這個(gè)jar包。因?yàn)轫?xiàng)目運(yùn)行的時(shí)候需要這個(gè)Jar,并且我們得拷貝在WEB-INF/lib目錄下

<groupId>org.apache.maven.plugins</groupId>  
<artifactId>maven-war-plugin</artifactId>  
<configuration>  
    <webResources>  
        <resource>  
            <directory>${project.basedir}/lib</directory>  
            <targetPath>WEB-INF/lib</targetPath>  
            <filtering>false</filtering>  
            <includes>  
                <include>**/*.jar</include>  
            </includes>  
        </resource>  
    </webResources>  
</configuration>  
<version>2.1.1</version>  

集成

在使用SDK調(diào)用具體API前,需要先配置通用接入?yún)?shù)

參數(shù)

1、APP_ID 使用沙箱模式中的APP_ID.
2、APP_PRIVATE_KEY ALIPAY_PUBLIC_KEY 使用文章2、配置應(yīng)用環(huán)境中生成的測試密鑰.
3、CHARSET 默認(rèn)使用UTF-8

然后,使用上述接入?yún)?shù)初始化AlipayClient:

AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",APP_ID,APP_PRIVATE_KEY,"json",CHARSET,ALIPAY_PUBLIC_KEY);

接下來,就可以用alipayClient來調(diào)用具體的API了。alipayClient只需要初始化一次,后續(xù)調(diào)用不同的API都可以使用同一個(gè)alipayClient對象。

手機(jī)網(wǎng)站支付不支持第三方授權(quán),不能代商家發(fā)起請求。

調(diào)用接口

手機(jī)網(wǎng)站支付產(chǎn)品包含兩類API:
頁面跳轉(zhuǎn)類:需要從前端頁面以Form表單的形式發(fā)起請求,瀏覽器會(huì)自動(dòng)跳轉(zhuǎn)至支付寶的相關(guān)頁面(一般是收銀臺或簽約頁面),用戶在該頁面完成相關(guān)業(yè)務(wù)操作后再回跳到商戶指定頁面。例如本產(chǎn)品中的手機(jī)網(wǎng)站支付接口alipay.trade.wap.pay。

系統(tǒng)調(diào)用類:直接從服務(wù)端發(fā)起HTTP請求,支付寶會(huì)同步返回請求結(jié)果。例如本產(chǎn)品中的交易查詢等配套API。

調(diào)用流程圖
調(diào)用流程
使用說明
使用SDK快速接入

手機(jī)網(wǎng)站支付alipay.trade.wap.pay:
對于頁面跳轉(zhuǎn)類API,SDK不會(huì)也無法像系統(tǒng)調(diào)用類API一樣自動(dòng)請求支付寶并獲得結(jié)果,而是在接受request請求對象后,為開發(fā)者生成前臺頁面請求需要的完整form表單的html(包含自動(dòng)提交腳本),商戶直接將這個(gè)表單的String輸出到http response中即可。

public void doPost(HttpServletRequest httpRequest,
                      HttpServletResponse httpResponse) throws ServletException, IOException {
    AlipayClient alipayClient = ... //獲得初始化的AlipayClient
    AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();//創(chuàng)建API對應(yīng)的request
    alipayRequest.setReturnUrl("http://domain.com/CallBack/return_url.jsp");
    alipayRequest.setNotifyUrl("http://domain.com/CallBack/notify_url.jsp");//在公共參數(shù)中設(shè)置回跳和通知地址
    alipayRequest.setBizContent("{" +
        "    \"out_trade_no\":\"20150320010101002\"," +
        "    \"total_amount\":88.88," +
        "    \"subject\":\"Iphone6 16G\"," +
        "    \"seller_id\":\"2088123456789012\"," +
        "    \"product_code\":\"QUICK_WAP_PAY\"" +
        "  }");//填充業(yè)務(wù)參數(shù)
    String form = alipayClient.pageExecute(alipayRequest).getBody(); //調(diào)用SDK生成表單
    httpResponse.setContentType("text/html;charset=" + AlipayServiceEnvConstants.CHARSET);
    httpResponse.getWriter().write(form);//直接將完整的表單html輸出到頁面
    httpResponse.getWriter().flush();
}

異步通知驗(yàn)簽
Map<String, String> paramsMap = ... //將異步通知中收到的所有參數(shù)都存放到map中
boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, ALIPAY_PUBLIC_KEY, CHARSET) //調(diào)用SDK驗(yàn)證簽名
if(signVerfied){
    // TODO 驗(yàn)簽成功后,按照支付結(jié)果異步通知中的描述,對支付結(jié)果中的業(yè)務(wù)內(nèi)容進(jìn)行二次校驗(yàn),校驗(yàn)成功后在response中返回success并繼續(xù)商戶自身業(yè)務(wù)處理,校驗(yàn)失敗返回failure
}else{
    // TODO 驗(yàn)簽失敗則記錄異常日志,并在response中返回failure.
}

服務(wù)端具體封裝

將參數(shù)獨(dú)立配置在一個(gè)屬性文件中方便管理,當(dāng)然也可以從數(shù)據(jù)庫

沙盒環(huán)境配置參數(shù)

加載接入?yún)?shù)并初始化AlipayClient

加載接入?yún)?shù)并初始化`AlipayClient`

使用SDK快速接入代碼封裝


public void wapPay(){
        String body="我是測試數(shù)據(jù)";
        String subject="Iphone6 16G";
        String total_amount="0.01";
        String passback_params="1";
        
        BizContent content = new BizContent();
        content.setBody(body);
        content.setOut_trade_no(OrderInfoUtil2_0.getOutTradeNo());;
        content.setPassback_params(passback_params);
        content.setSubject(subject);
        content.setTotal_amount(total_amount);
        content.setProduct_code("QUICK_WAP_PAY");
        
        
        try {
            AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();//創(chuàng)建API對應(yīng)的request
            alipayRequest.setReturnUrl("http://javen.tunnel.qydev.com/alipay/return_url");
            alipayRequest.setNotifyUrl("http://javen.tunnel.qydev.com/alipay/notify_url");//在公共參數(shù)中設(shè)置回跳和通知地址
            //參數(shù)參考 https://doc.open.alipay.com/doc2/detail.htm?treeId=203&articleId=105463&docType=1#s0
            System.out.println(JsonKit.toJson(content));
            alipayRequest.setBizContent(JsonKit.toJson(content));//填充業(yè)務(wù)參數(shù)
                String form = alipayClient.pageExecute(alipayRequest).getBody(); //調(diào)用SDK生成表單
                HttpServletResponse httpResponse = getResponse();
                httpResponse.setContentType("text/html;charset=" + charset);
                httpResponse.getWriter().write(form);//直接將完整的表單html輸出到頁面
                httpResponse.getWriter().flush();
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        renderNull();
    }
public void return_url() {
        try {
            // 獲取支付寶GET過來反饋信息
            Map<String, String> map = AliPayApi.toMap(getRequest());
            for (Map.Entry<String, String> entry : map.entrySet()) {
                System.out.println(entry.getKey() + " = " + entry.getValue());
            }

            boolean verify_result = AlipaySignature.rsaCheckV1(map, AliPayApi.ALIPAY_PUBLIC_KEY, AliPayApi.CHARSET,
                    AliPayApi.SIGN_TYPE);

            if (verify_result) {// 驗(yàn)證成功
                // TODO 請?jiān)谶@里加上商戶的業(yè)務(wù)邏輯程序代碼
                System.out.println("return_url 驗(yàn)證成功");
                renderText("success");
                return;
            } else {
                System.out.println("return_url 驗(yàn)證失敗");
                // TODO
                renderText("failure");
                return;
            }
        } catch (AlipayApiException e) {
            e.printStackTrace();
            renderText("failure");
        }
    }
public void notify_url() {
        try {
            // 獲取支付寶POST過來反饋信息
            Map<String, String> params = AliPayApi.toMap(getRequest());

            for (Map.Entry<String, String> entry : params.entrySet()) {
                System.out.println(entry.getKey() + " = " + entry.getValue());
            }

            boolean verify_result = AlipaySignature.rsaCheckV1(params, AliPayApi.ALIPAY_PUBLIC_KEY, AliPayApi.CHARSET,
                    AliPayApi.SIGN_TYPE);

            if (verify_result) {// 驗(yàn)證成功
                // TODO 請?jiān)谶@里加上商戶的業(yè)務(wù)邏輯程序代碼
                System.out.println("notify_url 驗(yàn)證成功succcess");
                renderText("success");
                return;
            } else {
                System.out.println("notify_url 驗(yàn)證失敗");
                // TODO
                renderText("failure");
                return;
            }
        } catch (AlipayApiException e) {
            e.printStackTrace();
            renderText("failure");
        }
    }
/**
     * 將異步通知的參數(shù)轉(zhuǎn)化為Map
     * @param request
     * @return
     */
    public static Map<String, String> toMap(HttpServletRequest request) {
        Map<String, String> params = new HashMap<String, String>();
        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] + ",";
            }
            // 亂碼解決,這段代碼在出現(xiàn)亂碼時(shí)使用。
            // valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
            params.put(name, valueStr);
        }
        return params;
    }

此項(xiàng)目源碼【下載地址

測試

下載部署如果沒有做任何修改默認(rèn)的分別為:
測試地址:http://域名或者IP/alipay/wapPay
回跳地址:http://域名或者IP/alipay/return_url
通知地址:http://域名或者IP/alipay/notify_url

測試截圖

wap支付頁面
輸入支付賬號以及密碼
確認(rèn)付款
輸入支付密碼
支付成功
回跳頁面

推薦閱讀
Android版-微信APP支付
極速開發(fā)微信公眾號之微信買單
極速開發(fā)微信公眾號之公眾號支付
極速開發(fā)微信公眾號之掃碼支付
極速開發(fā)微信公眾號之刷卡支付
極速開發(fā)微信公眾號之現(xiàn)金紅包
Android版-支付寶APP支付

記錄學(xué)習(xí)的點(diǎn)滴,以此勉勵(lì)不斷奮斗的自己?????? 如果對你有幫助記得點(diǎn)喜歡

源碼下載地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,716評論 25 709
  • 支付寶簡介文檔 (適用于ydm-java接口與后臺,如有誤入,但愿也能給您帶來幫助) 此文檔寫于2017年3月,只...
    隔壁付叔叔閱讀 17,340評論 3 19
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,502評論 19 139
  • 此項(xiàng)目已開源 趕快來圍觀 Start支持下吧 【客戶端開源地址-JPay】【服務(wù)端端開源地址-在com.javen...
    LucasAdam閱讀 2,101評論 0 3
  • 重陽節(jié)之后每天的陽光都讓人出乎意料,“天無三日晴”的魔咒似乎被打破,連續(xù)好幾日都是大好陽光。每天看到一眼太陽剛升起...
    田田拾光閱讀 830評論 0 3

友情鏈接更多精彩內(nèi)容