shop第七天

shop第七天

學(xué)習(xí)目標(biāo)

支付寶支付沙箱環(huán)境集成配置

? ? 使用螞蟻金服開(kāi)放平臺(tái)官網(wǎng)提供的支付寶支付api實(shí)現(xiàn)在線支付操作,具體集成配置如下(這里以沙箱環(huán)境為主實(shí)現(xiàn)支付寶在線支付集成操作):

開(kāi)放平臺(tái)提供支付接入api 與文檔步驟說(shuō)明,我們先登錄支付寶帳號(hào)。

開(kāi)發(fā)接入

選擇頂部菜單的開(kāi)發(fā)接入,點(diǎn)擊進(jìn)入開(kāi)發(fā)接入頁(yè)面

可以看到支付寶提供支付應(yīng)用接入功能,在接入支付功能時(shí),真實(shí)賬號(hào)需要進(jìn)行實(shí)名認(rèn)證同時(shí)需要提供企業(yè)工商注冊(cè)信息 后續(xù)經(jīng)過(guò)審核通過(guò)后方可使用,手續(xù)比較麻煩。這里以沙箱環(huán)境為主,重點(diǎn)介紹支付寶支付沙箱環(huán)境配置與支付流程分析!?。?/b>

繼續(xù)下拉頁(yè)面找到開(kāi)發(fā)服板塊,然后點(diǎn)擊沙箱進(jìn)入沙箱環(huán)境使用說(shuō)明頁(yè)面

頁(yè)面具體介紹了沙箱環(huán)境下環(huán)境具體配置與環(huán)境集成,核心步驟總結(jié)如下(詳情參看: https://docs.open.alipay.com/200/105311)

入駐商戶

按支付寶的提示點(diǎn)擊沙箱環(huán)境,進(jìn)入沙箱環(huán)境頁(yè)面,如果你是第一次使用螞蟻金服開(kāi)放平臺(tái),那么會(huì)進(jìn)入入駐頁(yè)面,需要加入螞蟻金服開(kāi)放平臺(tái),成為一名開(kāi)發(fā)者。

按要求填寫(xiě)必填項(xiàng),然后同意開(kāi)放平臺(tái)服務(wù)協(xié)議,點(diǎn)擊提交入駐申請(qǐng),成為開(kāi)發(fā)者

沙箱應(yīng)用

配置講解

返回第三步的剛開(kāi)始,繼續(xù)點(diǎn)擊沙箱環(huán)境,下面會(huì)進(jìn)入沙箱應(yīng)用頁(yè)面進(jìn)行沙箱環(huán)境配置

進(jìn)入頁(yè)面后會(huì)看到如下信息,我們要做的就是設(shè)置應(yīng)用公鑰,先來(lái)講解一下相關(guān)知識(shí)

應(yīng)用唯一標(biāo)識(shí)id-APPID

 在對(duì)接支付寶支付時(shí),必須在開(kāi)放平臺(tái)配置應(yīng)用,系統(tǒng)分配唯一的應(yīng)用標(biāo)識(shí)id 沙箱環(huán)境以自動(dòng)為開(kāi)發(fā)者配置完畢,可以直接使用(生產(chǎn)環(huán)境這里需要開(kāi)發(fā)人員手動(dòng)配置并審核通過(guò)方可使用,應(yīng)用配置地址,參考:

 登錄支付寶賬號(hào)后訪問(wèn): https://openhome.alipay.com/platform/appManage.htm#/apps

支付寶網(wǎng)關(guān)

 通過(guò)網(wǎng)站進(jìn)行支付時(shí)沙箱環(huán)境與生產(chǎn)環(huán)境的支付網(wǎng)關(guān)不同

應(yīng)用開(kāi)發(fā)者私鑰與公鑰

 在每個(gè)應(yīng)用下集成支付時(shí),開(kāi)放平臺(tái)均會(huì)提供不同的應(yīng)用公鑰與私鑰,每個(gè)應(yīng)用在配置公鑰與使用時(shí)保證配對(duì)正確才能正確完成支付接口調(diào)用操作,重點(diǎn)說(shuō)明公鑰與私鑰生成,公鑰修改,公鑰私鑰正確性匹配校驗(yàn)

生成RSA密鑰

下載密鑰生成工具

鼠標(biāo)移入感嘆號(hào),點(diǎn)擊密鑰的生成方法,進(jìn)入密鑰生成頁(yè)面

這里以windows系統(tǒng)為例下載相關(guān)文件,在本地生成公鑰與私鑰

點(diǎn)擊下載

生成密鑰

根據(jù)頁(yè)面詳細(xì)步驟提示生成密鑰,妥善保管

生成的結(jié)果會(huì)存儲(chǔ)在RSA密鑰文件夾內(nèi)

上傳公鑰

點(diǎn)擊設(shè)置應(yīng)用公鑰

點(diǎn)擊設(shè)置應(yīng)用公鑰

驗(yàn)證公鑰

修改公鑰

如果不小心輸入錯(cuò)誤,或者以后要修改公鑰,點(diǎn)擊查看應(yīng)用公鑰

點(diǎn)擊修改按鈕進(jìn)行修改

支付SKD集成

下載方式一

在沙箱應(yīng)用頁(yè)面,下拉頁(yè)面可以看到

進(jìn)入電腦網(wǎng)站支付產(chǎn)品頁(yè)面,該頁(yè)面介紹了如何使用SDK以及DEMO代碼

點(diǎn)擊獲取產(chǎn)品

無(wú)需開(kāi)通服務(wù),直接下載DEMO即可

這個(gè)DEMO是官方提供的一份完整版的DEMO,資料比較齊全

下載方式二

點(diǎn)擊頁(yè)面左側(cè)導(dǎo)航的SDK&Demo,在右側(cè)點(diǎn)擊下載和使用教程可以查看Maven坐標(biāo)

https://search.maven.org/search?q=g:com.alipay.sdk%20AND%20a:alipay-sdk-java&core=gav

返回頁(yè)面獲取DEMO

這個(gè)DEMO內(nèi)容比較單一(支付相關(guān)的),使用此DEMO開(kāi)發(fā)即可

構(gòu)建支付DEMO項(xiàng)目并測(cè)試支付(沙箱環(huán)境)

根據(jù)DEMO項(xiàng)目中的lib文件夾jar包可以得知我們需要

依賴(lài)alipay-sdk坐標(biāo)和commons-logging坐標(biāo)

創(chuàng)建項(xiàng)目

添加依賴(lài)

pom.xml

<?xmlversion="1.0" encoding="UTF-8"?>

?

<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>

?

<groupId>com.xxxx</groupId>

<artifactId>demo-alipay</artifactId>

<version>1.0-SNAPSHOT</version>

<packaging>war</packaging>

?

?

<properties>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<maven.compiler.source>1.8</maven.compiler.source>

<maven.compiler.target>1.8</maven.compiler.target>

</properties>

?

<dependencies>

<!-- alipay依賴(lài) -->

<dependency>

<groupId>com.alipay.sdk</groupId>

<artifactId>alipay-sdk-java</artifactId>

<version>4.8.73.ALL</version>

</dependency>

</dependencies>

?

<build>

<finalName>demo-alipay</finalName>

<plugins>

<!-- 添加maven jetty插件 -->

<plugin>

<groupId>org.mortbay.jetty</groupId>

<artifactId>maven-jetty-plugin</artifactId>

<version>6.1.26</version>

<configuration>

<scanIntervalSeconds>10</scanIntervalSeconds>

<!-- 項(xiàng)目訪問(wèn)路徑 -->

<contextPath>/demo-alipay</contextPath>

</configuration>

</plugin>

</plugins>

</build>

</project>

復(fù)制源碼、資源頁(yè)面到相關(guān)目錄

修改支付配置類(lèi)

修改app_id

商戶私鑰merchant_private_key

支付寶公鑰alipay_public_key

支付寶網(wǎng)關(guān)gatewayUrl為沙箱環(huán)境配置

設(shè)置支付同步與異步通知回調(diào)地址

AlipayConfig.java

packagecom.alipay.config;

?

importjava.io.FileWriter;

importjava.io.IOException;

?

/* *

*類(lèi)名:AlipayConfig

*功能:基礎(chǔ)配置類(lèi)

*詳細(xì):設(shè)置帳戶有關(guān)信息及返回路徑

*說(shuō)明:

*以下代碼只是為了方便商戶測(cè)試而提供的樣例代碼,商戶可以根據(jù)自己網(wǎng)站的需要,按照技術(shù)文檔編寫(xiě),并非一定要使用該代碼。

*該代碼僅供學(xué)習(xí)和研究支付寶接口使用,只是提供一個(gè)參考。

*/

?

publicclassAlipayConfig{


//↓↓↓↓↓↓↓↓↓↓請(qǐng)?jiān)谶@里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

?

// 應(yīng)用ID,您的APPID,收款賬號(hào)既是您的APPID對(duì)應(yīng)支付寶賬號(hào)

publicstaticStringapp_id="";


// 商戶私鑰,您的PKCS8格式RSA2私鑰

publicstaticStringmerchant_private_key="";


// 支付寶公鑰,查看地址:https://openhome.alipay.com/platform/keyManage.htm 對(duì)應(yīng)APPID下的支付寶公鑰。

publicstaticStringalipay_public_key="";

?

// 服務(wù)器異步通知頁(yè)面路徑? 需http://格式的完整路徑,不能加?id=123這類(lèi)自定義參數(shù),必須外網(wǎng)可以正常訪問(wèn)

publicstaticStringnotify_url="http://alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp";

?

// 頁(yè)面跳轉(zhuǎn)同步通知頁(yè)面路徑 需http://格式的完整路徑,不能加?id=123這類(lèi)自定義參數(shù),必須外網(wǎng)可以正常訪問(wèn)

publicstaticStringreturn_url="http://alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp";

?

// 簽名方式

publicstaticStringsign_type="RSA2";


// 字符編碼格式

publicstaticStringcharset="utf-8";


// 支付寶網(wǎng)關(guān)

publicstaticStringgatewayUrl="https://openapi.alipaydev.com/gateway.do";


// 支付寶網(wǎng)關(guān)

publicstaticStringlog_path="C:\\";

?

?

//↑↑↑↑↑↑↑↑↑↑請(qǐng)?jiān)谶@里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

?

/**

* 寫(xiě)日志,方便測(cè)試(看網(wǎng)站需求,也可以改成把記錄存入數(shù)據(jù)庫(kù))

* @param sWord 要寫(xiě)入日志里的文本內(nèi)容

*/

publicstaticvoidlogResult(StringsWord) {

FileWriterwriter=null;

try{

writer=newFileWriter(log_path+"alipay_log_"+System.currentTimeMillis()+".txt");

writer.write(sWord);

}catch(Exceptione) {

e.printStackTrace();

}finally{

if(writer!=null) {

try{

writer.close();

}catch(IOExceptione) {

e.printStackTrace();

? ? ? ? ? ? ?? }

? ? ? ? ?? }

? ? ?? }

?? }

}

配置jetty啟動(dòng)

訪問(wèn)測(cè)試

按步驟進(jìn)行測(cè)試,這里的款項(xiàng)扣除的都是沙箱環(huán)境的金額,不是真正的人名幣不用擔(dān)心點(diǎn)擊付款

點(diǎn)擊登錄賬戶付款

注:手機(jī)端執(zhí)行支付,需要使用沙箱環(huán)境支付寶app(目前僅限安卓端測(cè)試,ios 端暫沒(méi)有提供)

回到沙箱帳號(hào)頁(yè)面,使用買(mǎi)家信息登錄進(jìn)行付款

注:支付寶的支付核心業(yè)務(wù)邏輯寫(xiě)在了jsp頁(yè)面當(dāng)中,接下來(lái)我們開(kāi)始詳細(xì)分析

商城支付功能實(shí)現(xiàn)

訂單系統(tǒng)添加依賴(lài)

shop-parent的pom.xml

<!-- alipay 依賴(lài) -->

<alipay.version>4.8.73.ALL</alipay.version>

?

?

<!-- alipay依賴(lài) -->

<dependency>

<groupId>com.alipay.sdk</groupId>

<artifactId>alipay-sdk-java</artifactId>

<version>${alipay.version}</version>

</dependency>

shop-order的pom.xml

<!-- alipay依賴(lài) -->

<dependency>

<groupId>com.alipay.sdk</groupId>

<artifactId>alipay-sdk-java</artifactId>

</dependency>

訂單系統(tǒng)添加支付寶配置類(lèi)

修改支付寶的配置類(lèi)并且引入訂單系統(tǒng),在原來(lái)修改的基礎(chǔ)上再添加同步通知地址

shop-order的AlipayConfig.java

packagecom.xxxx.order.config;

?

importjava.io.FileWriter;

importjava.io.IOException;

?

/* *

*類(lèi)名:AlipayConfig

*功能:基礎(chǔ)配置類(lèi)

*詳細(xì):設(shè)置帳戶有關(guān)信息及返回路徑

*說(shuō)明:

*以下代碼只是為了方便商戶測(cè)試而提供的樣例代碼,商戶可以根據(jù)自己網(wǎng)站的需要,按照技術(shù)文檔編寫(xiě),并非一定要使用該代碼。

*該代碼僅供學(xué)習(xí)和研究支付寶接口使用,只是提供一個(gè)參考。

*/

?

publicclassAlipayConfig{

?

//↓↓↓↓↓↓↓↓↓↓請(qǐng)?jiān)谶@里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

?

// 應(yīng)用ID,您的APPID,收款賬號(hào)既是您的APPID對(duì)應(yīng)支付寶賬號(hào)

publicstaticStringapp_id="2016092800614468";

?

// 商戶私鑰,您的PKCS8格式RSA2私鑰

publicstaticStringmerchant_private_key="";

?

// 支付寶公鑰,查看地址:https://openhome.alipay.com/platform/keyManage.htm 對(duì)應(yīng)APPID下的支付寶公鑰。

publicstaticStringalipay_public_key="";

?

// 服務(wù)器異步通知頁(yè)面路徑? 需http://格式的完整路徑,不能加?id=123這類(lèi)自定義參數(shù),必須外網(wǎng)可以正常訪問(wèn)

publicstaticStringnotify_url="http://工程公網(wǎng)訪問(wèn)地址/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp";

?

// 頁(yè)面跳轉(zhuǎn)同步通知頁(yè)面路徑 需http://格式的完整路徑,不能加?id=123這類(lèi)自定義參數(shù),必須外網(wǎng)可以正常訪問(wèn)

publicstaticStringreturn_url="http://localhost:9092/shop-order/order/myOrder";

?

// 簽名方式

publicstaticStringsign_type="RSA2";

?

// 字符編碼格式

publicstaticStringcharset="utf-8";

?

// 支付寶網(wǎng)關(guān)

publicstaticStringgatewayUrl="https://openapi.alipaydev.com/gateway.do";

?

// 支付寶網(wǎng)關(guān)

publicstaticStringlog_path="C:\\";

?

?

//↑↑↑↑↑↑↑↑↑↑請(qǐng)?jiān)谶@里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

?

/**

* 寫(xiě)日志,方便測(cè)試(看網(wǎng)站需求,也可以改成把記錄存入數(shù)據(jù)庫(kù))

*

* @param sWord 要寫(xiě)入日志里的文本內(nèi)容

*/

publicstaticvoidlogResult(StringsWord) {

FileWriterwriter=null;

try{

writer=newFileWriter(log_path+"alipay_log_"+System.currentTimeMillis()+".txt");

writer.write(sWord);

}catch(Exceptione) {

e.printStackTrace();

}finally{

if(writer!=null) {

try{

writer.close();

}catch(IOExceptione) {

e.printStackTrace();

? ? ? ? ?? }

? ? ? ? }

? ?? }

? }

}

訂單系統(tǒng)編寫(xiě)Service

shop-order的OrderService.java

/**

* 通過(guò)訂單編號(hào)查詢(xún)訂單

* @param orderSn

* @return

*/

OrderselectOrderByOrderSn(StringorderSn);

shop-order的OrderServiceImpl.java

/**

* 通過(guò)訂單編號(hào)查詢(xún)訂單

* @param orderSn

* @return

*/

@Override

publicOrderselectOrderByOrderSn(StringorderSn) {

//創(chuàng)建查詢(xún)對(duì)象

OrderExampleexample=newOrderExample();

//創(chuàng)建查詢(xún)條件

example.createCriteria().andOrderSnEqualTo(orderSn);

//查詢(xún)

List<Order>orders=orderMapper.selectByExample(example);

if(CollectionUtils.isEmpty(orders)){

returnnull;

? }

returnorders.get(0);

}

訂單系統(tǒng)編寫(xiě)Controller

通過(guò)學(xué)習(xí)支付寶DEMO,發(fā)現(xiàn)核心的業(yè)務(wù)邏輯寫(xiě)在alipay.trade.page.pay.jsp中

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<metahttp-equiv="Content-Type"content="text/html; charset=utf-8">

<title>付款</title>

</head>

<%@pagelanguage="java"contentType="text/html; charset=utf-8"pageEncoding="utf-8"%>

<%@pageimport="com.alipay.config.*"%>

<%@pageimport="com.alipay.api.*"%>

<%@pageimport="com.alipay.api.request.*"%>

<%

//獲得初始化的AlipayClient

AlipayClientalipayClient=newDefaultAlipayClient(AlipayConfig.gatewayUrl,AlipayConfig.app_id,AlipayConfig.merchant_private_key,"json",AlipayConfig.charset,AlipayConfig.alipay_public_key,AlipayConfig.sign_type);


//設(shè)置請(qǐng)求參數(shù)

AlipayTradePagePayRequestalipayRequest=newAlipayTradePagePayRequest();

alipayRequest.setReturnUrl(AlipayConfig.return_url);

alipayRequest.setNotifyUrl(AlipayConfig.notify_url);


//商戶訂單號(hào),商戶網(wǎng)站訂單系統(tǒng)中唯一訂單號(hào),必填

Stringout_trade_no=newString(request.getParameter("WIDout_trade_no").getBytes("ISO-8859-1"),"UTF-8");

//付款金額,必填

Stringtotal_amount=newString(request.getParameter("WIDtotal_amount").getBytes("ISO-8859-1"),"UTF-8");

//訂單名稱(chēng),必填

Stringsubject=newString(request.getParameter("WIDsubject").getBytes("ISO-8859-1"),"UTF-8");

//商品描述,可空

Stringbody=newString(request.getParameter("WIDbody").getBytes("ISO-8859-1"),"UTF-8");


alipayRequest.setBizContent("{\"out_trade_no\":\""+out_trade_no+"\","

+"\"total_amount\":\""+total_amount+"\","

+"\"subject\":\""+subject+"\","

+"\"body\":\""+body+"\","

+"\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");


//若想給BizContent增加其他可選請(qǐng)求參數(shù),以增加自定義超時(shí)時(shí)間參數(shù)timeout_express來(lái)舉例說(shuō)明

//alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","

// ?? + "\"total_amount\":\""+ total_amount +"\","

// ?? + "\"subject\":\""+ subject +"\","

// ?? + "\"body\":\""+ body +"\","

// ?? + "\"timeout_express\":\"10m\","

// ?? + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

//請(qǐng)求參數(shù)可查閱【電腦網(wǎng)站支付的API文檔-alipay.trade.page.pay-請(qǐng)求參數(shù)】章節(jié)


//請(qǐng)求

Stringresult=alipayClient.pageExecute(alipayRequest).getBody();


//輸出

out.println(result);

%>

<body>

</body>

</html>

index.jsp發(fā)起請(qǐng)求調(diào)用alipay.trade.page.pay.jsp核心代碼

經(jīng)過(guò)修改編寫(xiě)為商城可用的代碼

shop-order的OrderController.java

/**

* 去付款

* @param request

* @param model

* @param orderSn

* @return

*/

@RequestMapping("payment")

public String payment(HttpServletRequest request, Model model, String orderSn) {

? try {

? ? ? //獲得初始化的AlipayClient

? ? ? AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id,

? ? ? ? ? ? AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key,

? ? ? ? ? ? AlipayConfig.sign_type);

? ? ? //設(shè)置請(qǐng)求參數(shù)

? ? ? AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();

? ? ? alipayRequest.setReturnUrl(AlipayConfig.return_url);

? ? ? alipayRequest.setNotifyUrl(AlipayConfig.notify_url);

? ? ? Order order = orderService.selectOrderByOrderSn(orderSn);

? ? ? //商戶訂單號(hào),商戶網(wǎng)站訂單系統(tǒng)中唯一訂單號(hào),必填

? ? ? String out_trade_no = orderSn;

? ? ? //付款金額,必填

? ? ? String total_amount = String.valueOf(order.getOrderAmount());

? ? ? //訂單名稱(chēng),必填

? ? ? String subject = "用戶為" + order.getUserId() + "的訂單";

? ? ? //商品描述,可空

? ? ? String body = " ";

? ? ? alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\","

? ? ? ? ? ? + "\"total_amount\":\"" + total_amount + "\","

? ? ? ? ? ? + "\"subject\":\"" + subject + "\","

? ? ? ? ? ? + "\"body\":\"" + body + "\","

? ? ? ? ? ? + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

? ? ? //若想給BizContent增加其他可選請(qǐng)求參數(shù),以增加自定義超時(shí)時(shí)間參數(shù)timeout_express來(lái)舉例說(shuō)明

? ? ? //alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","

? ? ? //? ? + "\"total_amount\":\""+ total_amount +"\","

? ? ? //? ? + "\"subject\":\""+ subject +"\","

? ? ? //? ? + "\"body\":\""+ body +"\","

? ? ? //? ? + "\"timeout_express\":\"10m\","

? ? ? //? ? + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

? ? ? //請(qǐng)求參數(shù)可查閱【電腦網(wǎng)站支付的API文檔-alipay.trade.page.pay-請(qǐng)求參數(shù)】章節(jié)

? ? ? //請(qǐng)求

? ? ? String result = alipayClient.pageExecute(alipayRequest).getBody();

? ? ? System.out.println(result);

? ? ? model.addAttribute("result", result);

? ? ? return "order/payment";

? } catch (Exception e) {

? ? ? e.printStackTrace();

? }

? return null;

}

/**

* 跳轉(zhuǎn)到我的訂單頁(yè)面

*

* @return

*/

@RequestMapping("myOrder")

public String myOrder() {

? /**

? ? * 這邊要處理對(duì)應(yīng)訂單對(duì)象里的狀態(tài)

? ? */

? System.out.println("同步回調(diào)成功,跳轉(zhuǎn)訂單頁(yè)面");

? return "order/myOrder";

}

輸出的內(nèi)容是一個(gè)表單加上一個(gè)javascript腳本,腳本目的在于提交表單。所以實(shí)際開(kāi)發(fā)中我們只需要拿到這個(gè)返回結(jié)果,把結(jié)果傳給前端,使表單自動(dòng)提交,就會(huì)跳轉(zhuǎn)至支付寶的支付頁(yè)面了。

shop-order的order/payment.ftl

<!DOCTYPE html>

<html>

<head>

? ? <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

? ? <title>Insert title here</title>

</head>

<body>

? ? ${result}

</body>

</html>

訂單系統(tǒng)頁(yè)面處理

shop-order的order/submitOrder.ftl

<form id="paymentForm" action="${ctx}/order/payment" method="post">

? ? <input type="hidden" name="orderSn" value="${orderSn}"/>

? ? <div class="osuccess">

? ? ? ? <strong class="tit">您的訂單提交成功!</strong>

? ? ? ? <p>我們講為您保留訂單2日,如果2日后EGO網(wǎng)仍未收到您的付款,我們將自動(dòng)取消此訂單。<br/>商品預(yù)計(jì)到達(dá)時(shí)間:2011年11月06日,星期日,下午14:00-18:00,請(qǐng)您注意查收。</p>

? ? ? ? <div class="ddinfo">

? ? ? ? ? ? 訂單編號(hào):${orderSn} <a class="blue" href="#">查看訂單詳情</a>

? ? ? ? ? ? <br/>付款方式:在線支持 中國(guó)銀行<br/>應(yīng)付金額:<strong class="red">¥${totalPrice}</strong>

? ? ? ? </div>

? ? ? ? <p class="gopay">

? ? ? ? ? ? <a href="javascript:void(0);" onclick="payment();">

? ? ? ? ? ? ? ? <img src="${ctx}/static/images/gopay.gif" width="88" height="36" alt=""/>

? ? ? ? ? ? </a>

? ? ? ? </p>

? ? ? ? <div class="nowgo">您現(xiàn)在還可以:<br/><a class="blue" href="#">返回首頁(yè)</a><a class="blue" href="#">繼續(xù)購(gòu)物</a><a

? ? ? ? ? ? ? ? ? ? class="blue" href="#">查看訂單</a><a class="blue" href="#">訂單中心</a></div>

? ? </div><!--osuccess end-->

</form>

<script type="text/javascript">

? ? // 去付款

? ? function payment() {

? ? ? ? $("#paymentForm").submit();

? ? }

</script>

將我的訂單.html放入shop-order/order/myOrder.ftl并進(jìn)行簡(jiǎn)單處理,主要是看同步回調(diào)是否能夠順利跳轉(zhuǎn)

測(cè)試

前臺(tái)系統(tǒng)添加至購(gòu)物車(chē)信息,點(diǎn)擊去結(jié)算

跳轉(zhuǎn)至訂單系統(tǒng)生成預(yù)訂單,準(zhǔn)備結(jié)算,點(diǎn)擊提交訂單

清空購(gòu)物車(chē),準(zhǔn)備去付款,點(diǎn)擊去付款

跳至支付寶進(jìn)行支付

支付流程結(jié)束,正常跳轉(zhuǎn)回前臺(tái)系統(tǒng)

(正常環(huán)境是進(jìn)入已購(gòu)買(mǎi)商品頁(yè),顯示訂單信息,購(gòu)買(mǎi)商品信息,發(fā)貨時(shí)間等等,而且在進(jìn)入已購(gòu)買(mǎi)商品頁(yè)的請(qǐng)求過(guò)程中修改訂單狀態(tài),支付狀態(tài),物流,發(fā)貨時(shí)間等等相關(guān)信息)

注:以上只是測(cè)試同步通知環(huán)境搭建成功,商城公測(cè)以后我們必須要保證異步通知環(huán)境可用

異步通知環(huán)境搭建

理解

 首先我們需要知道為什么需要異步通知,支付寶提供了同步通知和異步通知兩種方式,同步通知和異步通知的業(yè)務(wù)邏輯代碼是一致的(比如在我們商城中,我們需要修改訂單狀態(tài),支付狀態(tài),物流,發(fā)貨時(shí)間等等相關(guān)信息)。

 同步通知——用戶支付完成之后跳轉(zhuǎn)成功頁(yè)面給用戶展示已購(gòu)買(mǎi)信息...等等

 異步通知——用戶支付完成之后,支付寶會(huì)根據(jù)API中商戶傳入的notify_url,通過(guò)POST請(qǐng)求的形式將支付結(jié)果作為參數(shù)通知到商戶系統(tǒng)。說(shuō)白了就是告訴支付寶支付成功還是失敗了。

但是我們學(xué)習(xí)時(shí)都是內(nèi)網(wǎng)環(huán)境,無(wú)法實(shí)現(xiàn)公網(wǎng)環(huán)境,所以需要借助第三方工具。

7.2、NATAPP基于ngrok的國(guó)內(nèi)高速內(nèi)網(wǎng)穿透服務(wù)

? ? 官網(wǎng):https://natapp.cn/

? ? 點(diǎn)擊下載選擇適用于自己電腦的版本

NATAPP1分鐘快速新手圖文教程

根據(jù)https://natapp.cn/article/natapp_newbie快速上手

手機(jī)號(hào)注冊(cè)

完成注冊(cè)

實(shí)名認(rèn)證

免費(fèi)隧道

名稱(chēng)自定義,端口誤沖突,點(diǎn)擊免費(fèi)購(gòu)買(mǎi)

購(gòu)買(mǎi)成功

配置config.ini(推薦)

? ? 文件下載地址:https://natapp.cn/article/config_ini

? ? 將本文件放置于natapp同級(jí)目,將免費(fèi)隧道復(fù)制至authtoken即可

#將本文件放置于natapp同級(jí)目錄 程序?qū)⒆x取 [default] 段

#在命令行參數(shù)模式如 natapp -authtoken=xxx 等相同參數(shù)將會(huì)覆蓋掉此配置

#命令行參數(shù) -config= 可以指定任意config.ini文件

[default]

authtoken=? ? ? ? ? ? ? ? ? ? ? #對(duì)應(yīng)一條隧道的authtoken

clienttoken=? ? ? ? ? ? ? ? ? ? #對(duì)應(yīng)客戶端的clienttoken,將會(huì)忽略authtoken,若無(wú)請(qǐng)留空,

log=none? ? ? ? ? ? ? ? ? ? ? ? #log 日志文件,可指定本地文件, none=不做記錄,stdout=直接屏幕輸出 ,默認(rèn)為none

loglevel=ERROR? ? ? ? ? ? ? ? ? #日志等級(jí) DEBUG, INFO, WARNING, ERROR 默認(rèn)為 DEBUG

http_proxy=? ? ? ? ? ? ? ? ? ? #代理設(shè)置 如 http://10.123.10.10:3128 非代理上網(wǎng)用戶請(qǐng)務(wù)必留空

注 http_proxy 用于無(wú)法直接上網(wǎng),需要通過(guò)代理才能上網(wǎng)的用戶設(shè)置,其他用戶請(qǐng)留空

最終配置結(jié)果如下

啟動(dòng)natapp.exe

啟動(dòng)以后會(huì)得到一個(gè)公網(wǎng)地址,該公網(wǎng)地址映射我們的127.0.0.1:9091

前臺(tái)系統(tǒng)編寫(xiě)Controller

shop-portal的OrderController.java

/**

* 訂單系統(tǒng)完成后回調(diào)方法

* @param model

* @return

*/

@RequestMapping("callback")

public String callback(Model model){

? //我們?cè)谶@里需要對(duì)訂單對(duì)象進(jìn)行操作處理訂單狀態(tài)等一系列操作

? System.out.println("訂單支付成功");

? model.addAttribute("result","success");

? return "order/callback";

}

前臺(tái)系統(tǒng)頁(yè)面處理

shop-portal的callback.ftl

<!-- 設(shè)置項(xiàng)目根路徑全局變量 -->

<#assign ctx=request.contextPath/>

<!DOCTYPE html>

<html>

<head>

? ? <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

? ? <title>Insert title here</title>

</head>

<body>

<!-- 該頁(yè)面的結(jié)果是專(zhuān)門(mén)給支付寶用的 -->

${result}

</body>

</html>

訂單系統(tǒng)修改支付寶配置類(lèi)

shop-order的AlipayConfig.java

// 服務(wù)器異步通知頁(yè)面路徑? 需http://格式的完整路徑,不能加?id=123這類(lèi)自定義參數(shù),必須外網(wǎng)可以正常訪問(wèn)

public static String notify_url = "http://yba6sc.natappfree.cc/shop-portal/order/callback";

測(cè)試

同步通知——訂單系統(tǒng)是否正常跳轉(zhuǎn)至前臺(tái)系統(tǒng)

異步通知——控制臺(tái)是否輸出了支付成功!

兩條分支都走通了,說(shuō)明支付寶的支付環(huán)境已經(jīng)搭建成功。

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

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