SpringMVC 實現支付寶支付功能(沙箱環境)

Adrian_Dai發表於2018-05-03

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_idString32支付寶分配給開發者的應用ID2014072300007148
methodString128介面名稱alipay.trade.pay
formatString40僅支援JSONJSON
charsetString10請求使用的編碼格式,如utf-8,gbk,gb2312等utf-8
sign_typeString10商戶生成簽名字串所使用的簽名演算法型別,目前支援RSA2和RSA,推薦使用RSA2RSA2
signString344商戶請求引數的簽名串,詳見簽名詳見示例
timestampString19傳送請求的時間,格式"yyyy-MM-dd HH:mm:ss"2014-07-24 03:07:50
versionString3呼叫的介面版本,固定為:1.01.0
notify_urlString256支付寶伺服器主動通知商戶伺服器裡指定的頁面http/https路徑。http://api.test.alipay.net/atinterface/receive_notify.htm
app_auth_tokenString40詳見應用授權概述 
biz_contentString 請求引數的集合,最大長度不限,除公共引數外所有請求引數都必須放在這個引數中傳遞,具體參照各產品快速接入文件 

請求引數

引數型別是否必填最大長度描述示例值
out_trade_noString必選64商戶訂單號,64個字元以內、可包含字母、數字、下劃線;需保證在商戶端不重複20150320010101001
sceneString必選32支付場景 
條碼支付,取值:bar_code 
聲波支付,取值:wave_code
bar_code
auth_codeString必選32支付授權碼,25~30開頭的長度為16~24位的數字,實際字串長度以開發者獲取的付款碼長度為準28763443825664394
product_codeString可選32銷售產品碼FACE_TO_FACE_PAYMENT
subjectString必選256訂單標題Iphone6 16G
buyer_idString可選28買家的支付寶使用者id,如果為空,會從傳入了碼值資訊中獲取買家ID2088202954065786
seller_idString可選28如果該值為空,則預設為商戶簽約賬號對應的支付寶使用者ID2088102146225135
total_amountPrice可選11訂單總金額,單位為元,精確到小數點後兩位,取值範圍[0.01,100000000] 
如果同時傳入【可打折金額】和【不可打折金額】,該引數可以不用傳入; 
如果同時傳入了【可打折金額】,【不可打折金額】,【訂單總金額】三者,則必須滿足如下條件:【訂單總金額】=【可打折金額】+【不可打折金額】
88.88
trans_currencyString可選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、人民幣:CNYUSD
settle_currencyString可選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、人民幣:CNYUSD
discountable_amountPrice可選11參與優惠計算的金額,單位為元,精確到小數點後兩位,取值範圍[0.01,100000000]。 
如果該值未傳入,但傳入了【訂單總金額】和【不可打折金額】,則該值預設為【訂單總金額】-【不可打折金額】
8.88
bodyString可選128訂單描述Iphone6 16G
 goods_detailGoodsDetail[]可選 訂單包含的商品列表資訊,json格式,其它說明詳見商品明細說明 
operator_idString可選28商戶操作員編號yx_001
store_idString可選32商戶門店編號NJ_001
terminal_idString可選32商戶機具終端編號NJ_T_001
 extend_paramsExtendParams可選 業務擴充套件引數 
timeout_expressString可選6該筆訂單允許的最晚付款時間,逾期將關閉交易。取值範圍:1m~15d。m-分鐘,h-小時,d-天,1c-當天(1c-當天的情況下,無論交易何時建立,都在0點關閉)。 該引數數值不接受小數點, 如 1.5h,可轉換為 90m90m
auth_confirm_modeString可選32預授權確認模式,授權轉交易請求中傳入,適用於預授權轉交易業務使用,目前只支援PRE_AUTH(預授權產品碼) 
COMPLETE:轉交易支付完成結束預授權,解凍剩餘金額; NOT_COMPLETE:轉交易支付完成不結束預授權,不解凍剩餘金額
COMPLETE:轉交易支付完成結束預授權;NOT_COMPLETE:轉交易支付完成不結束預授權
terminal_paramsString可選2048商戶傳入終端裝置相關資訊,具體值要和支付寶約定{"key":"value"}


你可以按照業務的需求來對請求引數進行設定,下面展示一下回撥的響應引數

公共響應引數

引數型別是否必填最大長度描述示例值
codeString-閘道器返回碼,詳見文件40004
msgString-閘道器返回碼描述,詳見文件Business Failed
sub_codeString-業務返回碼,參見具體的API介面文件ACQ.TRADE_HAS_SUCCESS
sub_msgString-業務返回碼描述,參見具體的API介面文件交易已被支付
signString-簽名,詳見文件DZXh8eeTuAHoYE3w1J+POiPhfDxOYBfUNn1lkeT/V7P4zJdyojWEa6IZs6Hz0yDW5Cp/viufUb5I0/V5WENS3OYR8zRedqo6D+fUTdLHdc+EFyCkiQhBxIzgngPdPdfp1PIS7BdhhzrsZHbRqb7o4k3Dxc+AAnFauu4V6Zdwczo=

響應引數

引數型別是否必填最大長度描述示例值
trade_noString必填64支付寶交易號2013112011001004330000121536
out_trade_noString必填64商戶訂單號6823789339978248
buyer_logon_idString必填100買家支付寶賬號159****5620
total_amountPrice必填11交易金額120.88
trans_currencyString選填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、人民幣:CNYUSD
settle_currencyString選填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、人民幣:CNYUSD
settle_amountString選填11結算幣種訂單金額88.88
pay_currencyString選填8支付幣種CNY
pay_amountString選填11支付幣種訂單金額580.04
settle_trans_rateString選填32結算幣種兌換標價幣種匯率1
trans_pay_rateString選填32標價幣種兌換支付幣種匯率6.5261
receipt_amountString必填11實收金額88.88
buyer_pay_amountPrice選填11買家付款的金額8.88
point_amountPrice選填11使用集分寶付款的金額8.12
invoice_amountPrice選填11交易中可給使用者開具發票的金額12.50
gmt_paymentDate必填32交易支付時間2014-11-27 15:45:57
 fund_bill_listTradeFundBill必填 交易支付使用的資金渠道 
card_balancePrice選填11支付寶卡餘額98.23
store_nameString選填512發生支付交易的商戶門店名稱證大五道口店
buyer_user_idString必填28買家在支付寶的使用者id2088101117955611
discount_goods_detailString選填1024本次交易支付所使用的單品券優惠的商品優惠資訊[{"goods_id":"STANDARD1026181538","goods_name":"雪碧","discount_amount":"100.00","voucher_id":"2015102600073002039000002D5O"}]
 voucher_detail_listVoucherDetail選填 本交易支付時使用的所有優惠券資訊 
auth_trade_pay_modeString選填64預授權支付模式,該引數僅在信用預授權支付場景下返回。信用預授權支付:CREDIT_PREAUTH_PAYCREDIT_PREAUTH_PAY
business_paramsString選填512商戶傳入業務資訊,具體值要和支付寶約定 
將商戶傳入資訊分發給相應系統,應用於安全,營銷等引數直傳場景 
格式為json格式
{"data":"123"}
buyer_user_typeString選填18買家使用者型別。CORPORATE:企業使用者;PRIVATE:個人使用者。PRIVATE
mdiscount_amountString選填11商家優惠金額88.88
discount_amountString選填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;
	}


好了,本文就到這了。趕緊玩起來吧~~~

相關文章