SpringMVC 實現支付寶支付功能(沙箱環境)
springMVC實現的沙箱環境下的支付寶支付的功能,是沙箱環境下的,這裡只演示電腦上的掃碼支付。沒事就玩玩嘛
本文參考了支付寶官方文件:https://docs.open.alipay.com/catalog
首先先進入支付寶的開放平臺,點選“開放平臺-開發者中心-沙箱環境”。進入沙箱環境頁面。
第一次使用需要先進行申請,然後獲取到APPID,有這個才能呼叫支付寶開放產品的介面。
申請的話。我這裡就不說了。這個不會的話就評論找我吧。
一:準備環境
首先你需要下載支付寶的SDK,我這裡推薦使用maven來下載(官方也推薦)
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.0.0</version>
</dependency>
這裡廢話一句,推薦使用maven的時候配置一下阿里的映象。下載jar包的時候會快一些。
然後你可以閱讀一下下面的流程,請參考下面連結生成RSA金鑰
https://docs.open.alipay.com/291/105971
然後配置好公鑰後會在頁面會自動的給你生成好下面的圖片上的程式碼,這個非常有用。紅色那塊東西寫著是要你去複製上一步中生成的金鑰中的商戶應用私鑰。
這裡注意一下:如果你配置公鑰後再重新生成了一次公鑰,請重新配置,不然在你跑介面的時候會報錯的。
上面圖片這個地方找不到就開啟下面這個連結吧:
https://openhome.alipay.com/platform/appDaily.htm
在剛才的開發平臺頁面下面去下載沙箱環境的支付寶APP(安卓版的)
二:具體實現
當你做完上面的工作後,可以直接進行開發了。你可以進行分層的開發,我這邊就全部寫在Controller層上了。
在測試的時候你直接在瀏覽器發起get請求來訪問這個方法,支付個1000W嘗試一下支付的快感吧!!!
不要直接貼上下面的程式碼直接執行
記得替換下面我標註的地方!
記得替換下面我標註的地方!
記得替換下面我標註的地方!
重要的事情要多講
@RequestMapping("/ailpay") public void 方法名(HttpServletRequest request, HttpServletResponse response) throws IOException { AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipaydev.com/gateway.do", "你的APPID", "生成的金鑰中的商戶應用私鑰", "json","utf-8", "公鑰", "RSA2" ); //上面這個方法是不是很眼熟?就是剛才配置完公鑰後生成的那段,你可以直接複製然後加上你的私鑰就好 String out_trade_no = "訂單號"; out_trade_no = URLDecoder.decode(out_trade_no,"UTF-8"); String total_amount = "總金額"; total_amount = URLDecoder.decode(total_amount,"UTF-8"); String subject = "商品名稱"; subject = URLDecoder.decode(subject,"UTF-8"); String body = "商品描述"; body = URLDecoder.decode(body,"UTF-8"); AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();//建立API對應的request alipayRequest.setReturnUrl("回撥介面"); alipayRequest.setBizContent("{" + " \"out_trade_no\":\""+ out_trade_no +"\"," + " \"product_code\":\"FAST_INSTANT_TRADE_PAY\"," + " \"total_amount\":"+ total_amount +"," + " \"subject\":\""+ subject +"\"," + " \"body\":\""+ body +"\"" + " }"+ " }");//填充業務引數 String form=""; try { form = alipayClient.pageExecute(alipayRequest).getBody(); //呼叫SDK生成表單 } catch (AlipayApiException e) { e.printStackTrace(); } response.setContentType("text/html;charset=utf-8"); response.getWriter().println(form);//直接將完整的表單html輸出到頁面 response.getWriter().close(); }
這邊我沒有把全部的引數都加上,你們可以參考一下下面的引數(我複製了支付寶官方給出的公共的請求引數):
公共引數
請求地址
環境 | HTTPS請求地址 |
---|---|
正式環境 | https://openapi.alipay.com/gateway.do |
公共請求引數
引數 | 型別 | 是否必填 | 最大長度 | 描述 | 示例值 |
---|---|---|---|---|---|
app_id | String | 是 | 32 | 支付寶分配給開發者的應用ID | 2014072300007148 |
method | String | 是 | 128 | 介面名稱 | alipay.trade.pay |
format | String | 否 | 40 | 僅支援JSON | JSON |
charset | String | 是 | 10 | 請求使用的編碼格式,如utf-8,gbk,gb2312等 | utf-8 |
sign_type | String | 是 | 10 | 商戶生成簽名字串所使用的簽名演算法型別,目前支援RSA2和RSA,推薦使用RSA2 | RSA2 |
sign | String | 是 | 344 | 商戶請求引數的簽名串,詳見簽名 | 詳見示例 |
timestamp | String | 是 | 19 | 傳送請求的時間,格式"yyyy-MM-dd HH:mm:ss" | 2014-07-24 03:07:50 |
version | String | 是 | 3 | 呼叫的介面版本,固定為:1.0 | 1.0 |
notify_url | String | 否 | 256 | 支付寶伺服器主動通知商戶伺服器裡指定的頁面http/https路徑。 | http://api.test.alipay.net/atinterface/receive_notify.htm |
app_auth_token | String | 否 | 40 | 詳見應用授權概述 | |
biz_content | String | 是 | 請求引數的集合,最大長度不限,除公共引數外所有請求引數都必須放在這個引數中傳遞,具體參照各產品快速接入文件 |
請求引數
引數 | 型別 | 是否必填 | 最大長度 | 描述 | 示例值 |
---|---|---|---|---|---|
out_trade_no | String | 必選 | 64 | 商戶訂單號,64個字元以內、可包含字母、數字、下劃線;需保證在商戶端不重複 | 20150320010101001 |
scene | String | 必選 | 32 | 支付場景 條碼支付,取值:bar_code 聲波支付,取值:wave_code | bar_code |
auth_code | String | 必選 | 32 | 支付授權碼,25~30開頭的長度為16~24位的數字,實際字串長度以開發者獲取的付款碼長度為準 | 28763443825664394 |
product_code | String | 可選 | 32 | 銷售產品碼 | FACE_TO_FACE_PAYMENT |
subject | String | 必選 | 256 | 訂單標題 | Iphone6 16G |
buyer_id | String | 可選 | 28 | 買家的支付寶使用者id,如果為空,會從傳入了碼值資訊中獲取買家ID | 2088202954065786 |
seller_id | String | 可選 | 28 | 如果該值為空,則預設為商戶簽約賬號對應的支付寶使用者ID | 2088102146225135 |
total_amount | Price | 可選 | 11 | 訂單總金額,單位為元,精確到小數點後兩位,取值範圍[0.01,100000000] 如果同時傳入【可打折金額】和【不可打折金額】,該引數可以不用傳入; 如果同時傳入了【可打折金額】,【不可打折金額】,【訂單總金額】三者,則必須滿足如下條件:【訂單總金額】=【可打折金額】+【不可打折金額】 | 88.88 |
trans_currency | String | 可選 | 8 | 標價幣種, total_amount 對應的幣種單位。支援英鎊:GBP、港幣:HKD、美元:USD、新加坡元:SGD、日元:JPY、加拿大元:CAD、澳元:AUD、歐元:EUR、紐西蘭元:NZD、韓元:KRW、泰銖:THB、瑞士法郎:CHF、瑞典克朗:SEK、丹麥克朗:DKK、挪威克朗:NOK、馬來西亞林吉特:MYR、印尼盧比:IDR、菲律賓比索:PHP、模里西斯盧比:MUR、以色列新謝克爾:ILS、斯里蘭卡盧比:LKR、俄羅斯盧布:RUB、阿聯酋迪拉姆:AED、捷克克朗:CZK、南非蘭特:ZAR、人民幣:CNY | USD |
settle_currency | String | 可選 | 8 | 商戶指定的結算幣種,支援英鎊:GBP、港幣:HKD、美元:USD、新加坡元:SGD、日元:JPY、加拿大元:CAD、澳元:AUD、歐元:EUR、紐西蘭元:NZD、韓元:KRW、泰銖:THB、瑞士法郎:CHF、瑞典克朗:SEK、丹麥克朗:DKK、挪威克朗:NOK、馬來西亞林吉特:MYR、印尼盧比:IDR、菲律賓比索:PHP、模里西斯盧比:MUR、以色列新謝克爾:ILS、斯里蘭卡盧比:LKR、俄羅斯盧布:RUB、阿聯酋迪拉姆:AED、捷克克朗:CZK、南非蘭特:ZAR、人民幣:CNY | USD |
discountable_amount | Price | 可選 | 11 | 參與優惠計算的金額,單位為元,精確到小數點後兩位,取值範圍[0.01,100000000]。 如果該值未傳入,但傳入了【訂單總金額】和【不可打折金額】,則該值預設為【訂單總金額】-【不可打折金額】 | 8.88 |
body | String | 可選 | 128 | 訂單描述 | Iphone6 16G |
goods_detail | GoodsDetail[] | 可選 | 訂單包含的商品列表資訊,json格式,其它說明詳見商品明細說明 | ||
operator_id | String | 可選 | 28 | 商戶操作員編號 | yx_001 |
store_id | String | 可選 | 32 | 商戶門店編號 | NJ_001 |
terminal_id | String | 可選 | 32 | 商戶機具終端編號 | NJ_T_001 |
extend_params | ExtendParams | 可選 | 業務擴充套件引數 | ||
timeout_express | String | 可選 | 6 | 該筆訂單允許的最晚付款時間,逾期將關閉交易。取值範圍:1m~15d。m-分鐘,h-小時,d-天,1c-當天(1c-當天的情況下,無論交易何時建立,都在0點關閉)。 該引數數值不接受小數點, 如 1.5h,可轉換為 90m | 90m |
auth_confirm_mode | String | 可選 | 32 | 預授權確認模式,授權轉交易請求中傳入,適用於預授權轉交易業務使用,目前只支援PRE_AUTH(預授權產品碼) COMPLETE:轉交易支付完成結束預授權,解凍剩餘金額; NOT_COMPLETE:轉交易支付完成不結束預授權,不解凍剩餘金額 | COMPLETE:轉交易支付完成結束預授權;NOT_COMPLETE:轉交易支付完成不結束預授權 |
terminal_params | String | 可選 | 2048 | 商戶傳入終端裝置相關資訊,具體值要和支付寶約定 | {"key":"value"} |
你可以按照業務的需求來對請求引數進行設定,下面展示一下回撥的響應引數
公共響應引數
引數 | 型別 | 是否必填 | 最大長度 | 描述 | 示例值 |
---|---|---|---|---|---|
code | String | 是 | - | 閘道器返回碼,詳見文件 | 40004 |
msg | String | 是 | - | 閘道器返回碼描述,詳見文件 | Business Failed |
sub_code | String | 否 | - | 業務返回碼,參見具體的API介面文件 | ACQ.TRADE_HAS_SUCCESS |
sub_msg | String | 否 | - | 業務返回碼描述,參見具體的API介面文件 | 交易已被支付 |
sign | String | 是 | - | 簽名,詳見文件 | DZXh8eeTuAHoYE3w1J+POiPhfDxOYBfUNn1lkeT/V7P4zJdyojWEa6IZs6Hz0yDW5Cp/viufUb5I0/V5WENS3OYR8zRedqo6D+fUTdLHdc+EFyCkiQhBxIzgngPdPdfp1PIS7BdhhzrsZHbRqb7o4k3Dxc+AAnFauu4V6Zdwczo= |
響應引數
引數 | 型別 | 是否必填 | 最大長度 | 描述 | 示例值 |
---|---|---|---|---|---|
trade_no | String | 必填 | 64 | 支付寶交易號 | 2013112011001004330000121536 |
out_trade_no | String | 必填 | 64 | 商戶訂單號 | 6823789339978248 |
buyer_logon_id | String | 必填 | 100 | 買家支付寶賬號 | 159****5620 |
total_amount | Price | 必填 | 11 | 交易金額 | 120.88 |
trans_currency | String | 選填 | 5 | 標價幣種, total_amount對應的幣種單位。目前支援英鎊:GBP、港幣:HKD、美元:USD、新加坡元:SGD、日元:JPY、加拿大元:CAD、澳元:AUD、歐元:EUR、紐西蘭元:NZD、韓元:KRW、泰銖:THB、瑞士法郎:CHF、瑞典克朗:SEK、丹麥克朗:DKK、挪威克朗:NOK、馬來西亞林吉特:MYR、印尼盧比:IDR、菲律賓比索:PHP、模里西斯盧比:MUR、以色列新謝克爾:ILS、斯里蘭卡盧比:LKR、俄羅斯盧布:RUB、阿聯酋迪拉姆:AED、捷克克朗:CZK、南非蘭特:ZAR、人民幣:CNY | USD |
settle_currency | String | 選填 | 8 | 商戶指定的結算幣種,目前支援英鎊:GBP、港幣:HKD、美元:USD、新加坡元:SGD、日元:JPY、加拿大元:CAD、澳元:AUD、歐元:EUR、紐西蘭元:NZD、韓元:KRW、泰銖:THB、瑞士法郎:CHF、瑞典克朗:SEK、丹麥克朗:DKK、挪威克朗:NOK、馬來西亞林吉特:MYR、印尼盧比:IDR、菲律賓比索:PHP、模里西斯盧比:MUR、以色列新謝克爾:ILS、斯里蘭卡盧比:LKR、俄羅斯盧布:RUB、阿聯酋迪拉姆:AED、捷克克朗:CZK、南非蘭特:ZAR、人民幣:CNY | USD |
settle_amount | String | 選填 | 11 | 結算幣種訂單金額 | 88.88 |
pay_currency | String | 選填 | 8 | 支付幣種 | CNY |
pay_amount | String | 選填 | 11 | 支付幣種訂單金額 | 580.04 |
settle_trans_rate | String | 選填 | 32 | 結算幣種兌換標價幣種匯率 | 1 |
trans_pay_rate | String | 選填 | 32 | 標價幣種兌換支付幣種匯率 | 6.5261 |
receipt_amount | String | 必填 | 11 | 實收金額 | 88.88 |
buyer_pay_amount | Price | 選填 | 11 | 買家付款的金額 | 8.88 |
point_amount | Price | 選填 | 11 | 使用集分寶付款的金額 | 8.12 |
invoice_amount | Price | 選填 | 11 | 交易中可給使用者開具發票的金額 | 12.50 |
gmt_payment | Date | 必填 | 32 | 交易支付時間 | 2014-11-27 15:45:57 |
fund_bill_list | TradeFundBill | 必填 | 交易支付使用的資金渠道 | ||
card_balance | Price | 選填 | 11 | 支付寶卡餘額 | 98.23 |
store_name | String | 選填 | 512 | 發生支付交易的商戶門店名稱 | 證大五道口店 |
buyer_user_id | String | 必填 | 28 | 買家在支付寶的使用者id | 2088101117955611 |
discount_goods_detail | String | 選填 | 1024 | 本次交易支付所使用的單品券優惠的商品優惠資訊 | [{"goods_id":"STANDARD1026181538","goods_name":"雪碧","discount_amount":"100.00","voucher_id":"2015102600073002039000002D5O"}] |
voucher_detail_list | VoucherDetail | 選填 | 本交易支付時使用的所有優惠券資訊 | ||
auth_trade_pay_mode | String | 選填 | 64 | 預授權支付模式,該引數僅在信用預授權支付場景下返回。信用預授權支付:CREDIT_PREAUTH_PAY | CREDIT_PREAUTH_PAY |
business_params | String | 選填 | 512 | 商戶傳入業務資訊,具體值要和支付寶約定 將商戶傳入資訊分發給相應系統,應用於安全,營銷等引數直傳場景 格式為json格式 | {"data":"123"} |
buyer_user_type | String | 選填 | 18 | 買家使用者型別。CORPORATE:企業使用者;PRIVATE:個人使用者。 | PRIVATE |
mdiscount_amount | String | 選填 | 11 | 商家優惠金額 | 88.88 |
discount_amount | String | 選填 | 11 | 平臺優惠金額 | 88.88 |
可以參考一下我寫的回撥介面:
@RequestMapping("success")
public ModelAndView success(String out_trade_no,Double total_amount){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("success");
modelAndView.addObject("money",total_amount);
modelAndView.addObject("no",out_trade_no);
return modelAndView;
}
好了,本文就到這了。趕緊玩起來吧~~~
相關文章
- java實現沙箱測試環境支付寶支付(demo)和整合微信支付和支付寶支付到springmvc+spring+mybatis環境全過程(支付寶和微信支付、附原始碼)JavaSpringMVCMyBatis原始碼
- 沙箱環境開發支付寶支付,收不到非同步通知(使用Ngrok內網穿透)非同步內網穿透
- pc端實現支付寶支付
- 支付寶截圖反饋功能實現
- SSM 實現支付寶支付功能(圖文詳解+完整程式碼)SSM
- React網頁應用調起支付寶沙箱測試實現React網頁
- 親身經歷之微信支付沙箱環境掃碼支付遇到的那些坑
- Android 透過scheme跳轉支付寶實現支付AndroidScheme
- 支付寶支付
- Laravel實現支付寶分賬Laravel
- 小米手環3繫結支付寶免密支付教程 小米手環3支援支付寶免密支付嗎?
- 微信支付,支付寶支付
- 支付寶記賬功能怎麼用?支付寶記賬功能的使用方法
- 免SDK實現微信/支付寶轉賬打賞功能
- Laravel 整合 EasyAlipay 實現支付寶手機網站 Wap 支付Laravel網站
- 小米手環3怎麼設定支付寶免密支付?小米手環3支付寶免密支付設定新增教程
- 利用java實現提現金額到支付寶賬戶的功能Java
- 關於微信支付,支付寶支付
- Java 支付寶支付,退款,單筆轉賬到支付寶賬戶(支付寶訂單退款)Java
- android 整合微信支付和支付寶支付其實很簡單Android
- 支付寶alipay移動支付
- 支付寶、微信支付(.NET)
- vue-仿支付寶支付Vue
- Django呼叫支付寶支付介面Django
- Java接入支付寶支付教程Java
- day114:MoFang:基於支付寶沙箱測試環境完成建立充值訂單介面&服務端處理支付結果的同步通知和非同步通知服務端非同步
- PHP-Laravel支付寶支付和微信支付PHPLaravel
- Android 接入微信支付寶支付Android
- 支付寶微信合單支付
- 支付寶 v3 驗籤如何實現
- 微信,支付寶小程式實現原理概述
- 支付寶支付產品介面文件地址和支付寶代金券理解
- java對接支付寶支付(手機網站支付)Java網站
- 支付寶 InfoStr
- CS支付寶
- 微信、支付寶支付那點事
- 手機APP如何接入支付寶支付APP
- flutter 支付寶APP支付 (包含後臺)FlutterAPP