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;
}
好了,本文就到這了。趕緊玩起來吧~~~