對接【支付寶】支付接口

場景

最近在做支付寶的接口對接染坯,之前做過一個版本稽揭,但是由于申請了新的賬號以前舊的的接口對接就不能使用了

所以就開始對接新的版本接口對接翔忽,在這里也記錄一下讓那些還沒有對接的兄弟少走點彎路呼渣。

準備

先申請一個企業(yè)賬戶

https://memberprod.alipay.com/account/reg/enterpriseIndex.htm

創(chuàng)建應(yīng)用

去支付寶的開放平臺

https://open.alipay.com/platform/home.htm

添加應(yīng)用:

https://docs.open.alipay.com/200/105310

按照這個鏈接的文檔一步一步操作蔑祟;

賬號準備好之后早敬,就可以了解相關(guān)的接口了忌傻,以(即時到賬)支付接口為例。

閱讀接口文檔

https://docs.open.alipay.com/270/alipay.trade.page.pay/

下載SDK

https://docs.open.alipay.com/54/103419

選擇java版本

將sdk集成進入項目中

sdk中有一個jar包

將這個jar包上傳到私服上去搞监。

參考這個:

http://blog.csdn.net/huchunlinnk/article/details/17789175

項目引入sdk中的關(guān)鍵jar包

這里的gav的寫法取決于你上傳私服的時候的填寫


com.alipay

alipay-api

1.0.0

處理AlipayConfig對象

取消AlipayConfig配置文件中的部分常量

打開下載sdk應(yīng)該可以找到

將這個類中的前幾個靜態(tài)常量變成非靜態(tài)的水孩,以便可以支持多個配置對象。

/*?*

*類名:AlipayConfig

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

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

*修改日期:2017-04-05

*說明:

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

*該代碼僅供學習和研究支付寶接口使用绝淡,只是提供一個參考宙刘。

*/

@Data

publicclassAlipayConfig{

//↓↓↓↓↓↓↓↓↓↓請在這里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

//?應(yīng)用ID,您的APPID,收款賬號既是您的APPID對應(yīng)支付寶賬號

publicString?app_id?="";

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

publicString?merchant_private_key?="";

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

publicString?alipay_public_key?="";

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

publicString?notify_url?="";

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

publicString?return_url?="";

//?簽名方式

publicstaticString?sign_type?="RSA2";

//?字符編碼格式

publicstaticString?charset?="utf-8";

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

publicstaticString?gatewayUrl?="https://openapi.alipay.com/gateway.do";

//日志路徑

publicstaticString?log_path?="C:\\";

}

公眾號注:文中代碼看不全可左右滑動

編寫請求支付的接口

后端向支付寶發(fā)起支付的請求潘拨,在這個同時需要傳遞必要參數(shù)吊输,下面我們就來編寫如何向支付寶發(fā)起支付。

編寫conroller層

/**

*?阿里支付控制器

*

*@authorWangSen(wangsenhehe@126.com)

*@Date2017年8月16日

*/

@Controller

@RequestMapping("/alipay")

publicclassAliPayController{

@Autowired

privateAlipayViewService?alipayViewService;

/**

*?跳轉(zhuǎn)到去支付的jsp頁面

*

*@paramorderId?訂單號

*

*@parampayAccountType?支付賬號類型

*

*@parammodel?模型

*

*@throwsException

*/

@RequestMapping

publicvoidgotopay(longorderId,?Model?model)throwsException{

alipayViewService.setGoToPayInfo(orderId,?model);

}

}

編寫viewService層

/**

*?阿里支付頁面服務(wù)類

*

*@authorWangSen(wangsenhehe@126.com)

*@Date2017年8月16日

*/

@Service

publicclassAlipayViewService{

@Autowired

privateNewAlipayBusinessService?newAlipayBusinessService;

/**

*?設(shè)置去支付信息

*

*@paramorderId?訂單id

*@parammodel?模型

*@parampayAccountType?支付賬號類型

*

*@return構(gòu)建的字符串

*/

publicvoidsetGoToPayInfo(longorderId,?Model?model)throwsException{

model.addAttribute("htmlStr",?newAlipayBusinessService.buildPayRequest(orderId,?payPrice,"報名費","略"));

}

}

編寫service層

/**

*?新的阿里支付頁面服務(wù)類

*?

*?阿里升級接口之后使用這個服務(wù)類

*

*@authorWangSen(wangsenhehe@126.com)

*@Date2017年8月16日

*/

@Data

publicclassNewAlipayBusinessService{

/**

*?阿里的配置文件對象

*/

privateAlipayConfig?alipayConfig;

/**

*?構(gòu)建支付請求

*

*@paramorderId?訂單號

*@parampayPrice?付款金額

*@paramorderName?訂單名稱

*@parambody?商品描述

*

*@returnhtml字符串

*/

publicStringbuildPayRequest(longorderId,longpayPrice,?String?orderName,?String?body)throwsException{

//獲得初始化的AlipayClient

AlipayClient?alipayClient?=?getAlipayClient();

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

String?bizContent?=?getBizContent(ConvertUtil.obj2str(orderId),?AmountUtils.changeF2Y(payPrice),?orderName,

body);

returnalipayClient.pageExecute(setAlipayRequestParameters(bizContent)).getBody();

}

/**

*?設(shè)置阿里支付請求參數(shù)

*

*@parambizContent?包含關(guān)鍵參數(shù)的json字符串

*

*@returnAlipayTradePagePayRequest對象

*/

privateAlipayTradePagePayRequestsetAlipayRequestParameters(String?bizContent){

AlipayTradePagePayRequest?alipayRequest?=newAlipayTradePagePayRequest();

alipayRequest.setReturnUrl(alipayConfig.getReturn_url());

alipayRequest.setNotifyUrl(alipayConfig.getNotify_url());

alipayRequest.setBizContent(bizContent);

returnalipayRequest;

}

privateAlipayClientgetAlipayClient(){

AlipayClient?alipayClient?=newDefaultAlipayClient(AlipayConfig.gatewayUrl,?alipayConfig.getApp_id(),

alipayConfig.getMerchant_private_key(),"json",?AlipayConfig.charset,

alipayConfig.getAlipay_public_key(),?AlipayConfig.sign_type);

returnalipayClient;

}

/**

*?獲取業(yè)務(wù)的關(guān)鍵內(nèi)容

*

*@paramout_trade_no?訂單號

*@paramtotal_amount?付款金額

*@paramsubject?訂單名稱

*@parambody?商品描述

*

*@return拼接之后的json字符串

*/

privateStringgetBizContent(String?out_trade_no,?String?total_amount,?String?subject,?String?body){

ExceptionUtil.checkEmpty(out_trade_no,"訂單號不能為空");

ExceptionUtil.checkEmpty(total_amount,"價格不能為空");

ExceptionUtil.checkEmpty(subject,"訂單名稱不能為空");

ExceptionUtil.checkEmpty(body,"商品描述不能為空");

StringBuffer?sb?=newStringBuffer();

sb.append("{");

sb.append("\"out_trade_no\":\"").append(out_trade_no).append("\",");

sb.append("\"total_amount\":\"").append(total_amount).append("\",");

sb.append("\"subject\":\"").append(subject).append("\",");

sb.append("\"body\":\"").append(body).append("\",");

sb.append("\"product_code\":\"FAST_INSTANT_TRADE_PAY\"");

sb.append("}");

returnsb.toString();

}

}

通過xml文件配置支付對象

<?xml?version="1.0"?encoding="UTF-8"?>

xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"

xsi:schemaLocation="http://www.springframework.org/schema/beans?http://www.springframework.org/schema/beans/spring-beans-4.1.xsd

http://www.springframework.org/schema/context?http://www.springframework.org/schema/context/spring-context-4.1.xsd

http://www.springframework.org/schema/mvc?http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd"

>

<!--?數(shù)理化支付配置對象?-->

<!--?阿里支付業(yè)務(wù)服務(wù)類?-->

編寫jsp頁面

<%@pageimport="com.we.core.common.util.DateTimeUtil"%>

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

<!DOCTYPE?HTML?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN">

支付寶即時到賬交易接口

${htmlStr?}

測試

頁面訪問:

localhost:8091/alipay/gotopay.json?orderId=232323

就可以看到支付頁面了铁追;

編寫支付的異步通知接口

用戶支付完成之后支付寶會通過你配置的的notify_url的值進行回調(diào)季蚂,

我需要編寫這個邏輯,以完成整個的支付流程。

編寫controller層

/**

*?阿里支付控制器

*

*@authorWangSen(wangsenhehe@126.com)

*@Date2017年8月16日

*/

@Controller

@RequestMapping("/alipay")

publicclassAliPayController{

@Autowired

privateAlipayViewService?alipayViewService;

/**

*?支付完成

*/

@Void

@NotSso

@ResponseBody

@RequestMapping

publicvoidpayFinish()throwsException{

alipayViewService.payFinish();

}

}

編寫viewService層

/**

*?阿里支付頁面服務(wù)類

*

*@authorWangSen(wangsenhehe@126.com)

*@Date2017年8月16日

*/

@Service

publicclassAlipayViewService{

@Autowired

privateNewAlipayBusinessService?newAlipayBusinessService;

/**

*?支付完成

*

*@throwsIOException?io異常

*/

publicvoidpayFinish()throwsException{

newAlipayBusinessService.payFinish();

}

}

編寫處理支付完成的servie

/**

*?新的阿里支付頁面服務(wù)類

*?

*?阿里升級接口之后使用這個服務(wù)類

*

*?@author???WangSen(wangsenhehe@126.com)

*?@Date?????2017年8月16日

*/

@Data

publicclassNewAlipayBusinessService{

/**

*?阿里的配置文件對象

*/

privateAlipayConfig?alipayConfig;

/**

*?支付完成

*

*?@throws?Exception?異常對象

*/

publicvoidpayFinish()?throws?Exception{

HttpServletRequest?request?=?MvcUtil.getRequest();

PrintWriterout=?MvcUtil.getResponse().getWriter();

//獲取支付寶POST過來反饋信息

Mapparams=?getParames(request);

if(!isSuccess(params))?{

fail(out);

return;

}

longorderId?=?getOrderId(params);

longpayPrice?=?getTotalFee(params);

try{

//編輯你支付完成之后的邏輯

success(out);

}catch(Exception?e)?{

fail(out);

}

}

/**

*?獲取訂單id

*

*?@param?params?請求參數(shù)

*?@return?訂單id

*/

privatelonggetOrderId(Mapparams){

String?order_no?=params.get("out_trade_no");

returnConvertUtil.obj2long(order_no);

}

/**

*?獲取總金額

*

*?@param?params?請求參數(shù)

*?@return?總金額

*/

privatelonggetTotalFee(Mapparams){

String?total_fee?=params.get("total_amount");

returnConvertUtil.obj2long(AmountUtils.changeY2F(total_fee));

}

/**

*?校驗支付寶支付是否成功

*

*?@param?params?http請求

*?@return?成功即為真

*?@throws?AlipayApiException

*/

privatebooleanisSuccess(final?Mapparams)?throws?AlipayApiException{

boolean?signVerified?=?AlipaySignature.rsaCheckV1(params,?alipayConfig.getAlipay_public_key(),

AlipayConfig.charset,?AlipayConfig.sign_type);//調(diào)用SDK驗證簽名

if(!signVerified)?{

returnfalse;

}

//交易狀態(tài)

String?trade_status?=params.get("trade_status");

if(!trade_status.equals("TRADE_FINISHED")?&&?!trade_status.equals("TRADE_SUCCESS"))?{

returnfalse;

}

returntrue;

}

/**

*?成功

*

*?TODO?重構(gòu)方法名

*?@param?out?輸出流

*/

privatevoidsuccess(PrintWriterout){

out.println("success");

}

/**

*?失敗

*

*?TODO?重構(gòu)方法名

*?@param?out?輸出流

*/

privatevoidfail(PrintWriterout){

out.println("fail");

}

/**

*?獲取參數(shù)

*

*?@param?request?HttpServletRequest對象

*

*?@return?返回支付寶攜帶的參數(shù)

*/

privateMapgetParames(HttpServletRequest?request){

Mapparams=newHashMap();

@SuppressWarnings("unchecked")

Map?requestParams?=?request.getParameterMap();

for(Iterator?iter?=?requestParams.keySet().iterator();?iter.hasNext();)?{

String?name?=?ConvertUtil.obj2str(iter.next());

@SuppressWarnings("cast")

String[]?values?=?(String[])?requestParams.get(name);

String?valueStr?="";

for(inti?=0;?i?<?values.length;?i++)?{

valueStr?=?(i?==?values.length?-1)???valueStr?+?values[i]?:?valueStr?+?values[i]?+",";

}

//亂碼解決扭屁,這段代碼在出現(xiàn)亂碼時使用

//valueStr?=?new?String(valueStr.getBytes("ISO-8859-1"),?"utf-8");

params.put(name,?valueStr);

}

returnparams;

}

}

做的過程可能用到的資源

支付接口以及異步通知接口的參數(shù)詳解:

https://docs.open.alipay.com/270/105902/

生成公鑰私鑰的步驟:

https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=105971&docType=1

服務(wù)端的sdk:

https://docs.open.alipay.com/203/105910

即時到賬新老版本接口對比:

https://docs.open.alipay.com/270/106759

擴展閱讀

互聯(lián)網(wǎng)支付系統(tǒng)整體架構(gòu)詳解

微信支付之掃碼支付

支付系統(tǒng)設(shè)計:支付系統(tǒng)的賬戶模型

最強解析:支付寶系統(tǒng)架構(gòu)內(nèi)部剖析

Spring MVC+Spring+Mybatis實現(xiàn)支付寶支付功能(圖文詳解)

來源:https://www.cnblogs.com/wangsen/p/7512391.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末算谈,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子料滥,更是在濱河造成了極大的恐慌然眼,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件葵腹,死亡現(xiàn)場離奇詭異高每,居然都是意外死亡,警方通過查閱死者的電腦和手機践宴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門鲸匿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人阻肩,你說我怎么就攤上這事带欢。” “怎么了烤惊?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵乔煞,是天一觀的道長。 經(jīng)常有香客問我柒室,道長渡贾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任伦泥,我火速辦了婚禮剥啤,結(jié)果婚禮上锦溪,老公的妹妹穿的比我還像新娘不脯。我一直安慰自己,他們只是感情好刻诊,可當我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布防楷。 她就那樣靜靜地躺著,像睡著了一般则涯。 火紅的嫁衣襯著肌膚如雪复局。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天粟判,我揣著相機與錄音亿昏,去河邊找鬼。 笑死档礁,一個胖子當著我的面吹牛角钩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼递礼,長吁一口氣:“原來是場噩夢啊……” “哼惨险!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起脊髓,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤辫愉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后将硝,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恭朗,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年依疼,在試婚紗的時候發(fā)現(xiàn)自己被綠了冀墨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡涛贯,死狀恐怖诽嘉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情弟翘,我是刑警寧澤虫腋,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站稀余,受9級特大地震影響悦冀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜睛琳,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一盒蟆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧师骗,春花似錦历等、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至黍少,卻和暖如春寡夹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背厂置。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工菩掏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人昵济。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓智绸,卻偏偏與公主長得像或颊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子传于,可洞房花燭夜當晚...
    茶點故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內(nèi)容