只要思想不滑坡,辦法總比困難多!-----JAVA第三方支付(非阿里雲,非微信)
阿新 • • 發佈:2018-12-06
第三方支付(並不是阿里雲和微信)!
大概是第三方接入阿里雲,然後我在接入第三方支付!
!本人很菜,不接受反駁!
biubiubiu~
(づ ̄3 ̄)づ╭❤~
先寫一下開發步驟吧!
- 上級領導給我一份第三方支付的文件!
- 我們先解壓文件,並且開啟有用的文件!(手動滑稽!!)
閱讀文件的時候我們需要知道一些簡單的資訊!
3.1第三方使用什麼方式提交資料?(POST/GET).
3.2我們需要知道我們之間的加密方式是什麼?(RSA/MD5).
3.3檢視簽名的加密方式(RSA/MD5).注意MD5加密是區分大小寫的!!
3.4我們的請求報文方式是什麼?(POST/GET).
3.5說道這裡基本就可以開始搞了!怎麼搞?這讓我有點頭痛!!
現在跟隨我的大腦一起幻想,現在頁面上有一個框,框裡面有一些數字,而這些數字就是我要充值的價格,框後面有一個按鈕 按鈕一點就可以跳往第三方支付的支付頁面(手動滑稽);
1.按鈕一點選完畢就要提交資料了鴨!!(這個按鈕跳的路徑就是第三方給你的請求路徑)
2.這個時候我們應該按照第三文件的要求建立一個類(這個類要包含了第三方給你的欄位,記住型別不要錯)
3.我們按照欄位給欄位設定值,因為第三方是要求你傳輸過去的資料是有值的鴨!現在怎麼辦?好吧!我們按照要求將商戶號號碼,商戶金鑰,價格啊,訂單號設定到剛剛我們新建的第三方類裡面去,就好啦!
4.然後我們在根據第三方文件進行資料加密!注意你資料拼接的時候一定要按照第三方文件的格式去拼接!然後在使用加密工具進行加密(MD5/RSA);加密出來的值一般是會作為簽名提交給第三方!!!
5.請求報文的時候都有一個請求地址和回撥地址的引數,我們也按照要求設定給第三方類物件裡面.方便使用!(為什麼要設定類呢?)方便取值和賦值等等!
6.如果所有的資料格式都沒有問題的話,我們現在就可以以進入支付頁面了!如果出現問題的話,根據返回的狀態碼來確認自己的資料格式有沒有問題,一般都是加密方式錯誤,還有可能是拼接的時候順序拼接反了等等…
7.這個時候就應該掏出你的大手機了!開啟支付寶或者微信,進行支付!(ok!支付成功!)
8.你是不是以為到這裡就完了??並沒有!!!我這個時候開啟我的個人中心發現!!!我靠!!!我剛才充值的1000萬怎麼沒到賬!!!!!(這個時候你準備打電話給支付寶公司問問情況!!!客服反正也說有這一筆交易!!!但是由於不知道是不是你本人操作,我們無法給你提供更準確的訊息!)於是你又掏出了你的大手機準備給當前平臺的董事長打電話!!!這個時候技術技術經理過來!!!大聲呵斥道,你這個豬腦闊,人家第三方報文給你了,你自己不去處理自己的訂單狀態,不處理餘額狀態,等著我給你處理啊!!
9.於是我嘴上笑嘻嘻的(心裡mmp)看著經理,對著經理天真一笑~嘿嘿~~,對這個時候第三方會根據你提交時候的返回報文的地址進行返回報文,這個時候一般會連同之前傳輸給你的資料全部返回給你,並且會多了一個狀態碼(支付成功,支付失敗,未支付…)!!
10.這個時候你又要按照規則去將第三方返回的資料再去加密這一串資料,然後在進行對比!(是不是覺得有點腦殘?沒辦法嘛!人家也是為了安全!為了防止別人惡意串改)
11.一般情況下我們是可以通過request.getParameter(“”)這個方法獲取到資料的,這時候一般第三方會給我們一個簽名一般使用request.getParameter(“sign”)可以得到!
12.需要的資料獲取完了過後,我們就要進行日誌操作了,將一些日誌資訊儲存起來,以免以後使用者說自己充了錢沒有到賬的情況(然後我們就可以檢視日誌了鴨!).
13.我們將資料加密後得到一串字串我們叫他sgin1吧,request.getParameter(“sign”)獲取到的簽名的加密資料進行equals,看一看是不是為true,如果是true就可以進行使用者的餘額充值,訂單狀態操作等等………
(✺ω✺)大概就這麼多啦,當然不同的第三方支付可能支付請求的引數,格式,加密方式都不一樣,我這裡只是說一下大概的思路(✺ω✺)
(✺ω✺)哈哈哈哈哈哈~嗝~(✺ω✺)
(✺ω✺)然後分享一部分程式碼粗來!(✺ω✺)
(✺ω✺)請求的程式碼差不多是這樣子的!
//設定八達付支付請求物件
BadaPay baDaPay = new BadaPay();
//設定版本號,預設版本是3.0;
baDaPay.setVersion(chargePay.getInterfaceVersion());
//設定商戶號碼
baDaPay.setPartner(chargePay.getMemberId());
//設定介面名稱,介面是pay介面;
baDaPay.setMethod("pay");
//設定銀行型別,現在只支援ALIPAY;
baDaPay.setBanktype(payId);
//設定requestType的預設值
baDaPay.setRequesttype("pro");
//設定支付金額
baDaPay.setPaymoney(OrderMoney);
//設定商戶系統訂單號
baDaPay.setOrdernumber(orderId);
//設定下行非同步通知地址,返回地址
baDaPay.setCallbackurl(chargePay.getNotifyUrl());
//設定當前訂單時間戳
baDaPay.setTimestamp(currTime.getTime());
//設定herf引數
baDaPay.setHrefbackurl(returnUrl);
//設定相關引數
baDaPay.setGoodsname("");
baDaPay.setMemberId(currentUser.getUserName());
baDaPay.setAttach("");
//設定商戶祕鑰
baDaPay.setSign(chargePay.getSign());
//獲取商戶祕鑰
String MD5Key = chargePay.getSign();
String MARK = "&";
//需要加密的欄位;
String baDaPayMD5 = new String("version=" + baDaPay.getVersion() + MARK + "method=" + baDaPay.getMethod() + MARK + "partner=" + baDaPay.getPartner() + MARK
+ "banktype=" + baDaPay.getBanktype() + MARK + "paymoney=" + baDaPay.getPaymoney() + MARK + "ordernumber=" + orderId + MARK + "timestamp="
+ baDaPay.getTimestamp() + MARK + "callbackurl=" + baDaPay.getCallbackurl() + MD5Key);
String Signature = Md5Util.getMD5ofStr(baDaPayMD5, "GB2312");//獲取MD5值
log.info("md5原始串: " + baDaPayMD5 + "生成後的交易簽名:" + Signature);
//設定交易簽名
baDaPay.setSign(Signature);
//衝值訂單
RechargeWithDrawOrder rechargeOrder = new RechargeWithDrawOrder();
//管理員ID
rechargeOrder.setAdminId(null);
//使用者ID
rechargeOrder.setUserId(currentUser.getId());
//快捷ID
rechargeOrder.setChargePayId(chargePay.getId());
//使用者名稱稱
rechargeOrder.setUserName(currentUser.getUserName());
//申請金額
rechargeOrder.setApplyValue(new BigDecimal(orderMoneyYuan));
//訂單建立時間
rechargeOrder.setCreatedDate(new Date());
//操作型別
rechargeOrder.setOperateType(EFundOperateType.RECHARGE.name());
//充值型別
rechargeOrder.setPayType(payType);
//第三方充值型別
rechargeOrder.setThirdPayType(EFundThirdPayType.BDPAY.name());
//操作描述
rechargeOrder.setOperateDes(EFundPayType.valueOf(payType).getDescription());
//流水號
rechargeOrder.setSerialNumber(orderId);
rechargeOrder.setPostscript("");
rechargeOrder.setDealStatus(EFundRechargeStatus.PAYMENT.name());
rechargeOrder.setBankName("");
rechargeOrder.setSubbranchName("");
rechargeOrder.setBankUserName("");
rechargeOrder.setBankId("");
rechargeOrder.setBankUrl("");
rechargeOrder.setBankAliasName("");
rechargeOrder.setBankType("");
rechargeOrder.setBizSystem(currentUser.getBizSystem());
rechargeOrder.setRefType(EFundRefType.THIRDPAY.name());
rechargeOrder.setFromType(currentUser.getLoginType());
//儲存新的訂單到資料庫中
rechargeWithDrawOrderService.insertSelective(rechargeOrder);
(✺ω✺)表單提交的時候大概是這樣的!!(✺ω✺)
<form method="post" name="pay" id="pay" action="<%=payUrl%>">
<TABLE>
<TR>
<TD>
<input name='partner' type='hidden'value="<%=baDaPay.getPartner()%>" />
<input name='version' type='hidden' value="<%=baDaPay.getVersion()%>" />
<input name='requesttype' type='hidden' value="<%=baDaPay.getRequesttype()%>" />
<input name='method' type='hidden' value="<%=baDaPay.getMethod()%>" />
<input name='banktype' type='hidden' value="<%=baDaPay.getBanktype()%>" />
<input name='paymoney' type='hidden' value="<%=baDaPay.getPaymoney()%>" />
<input name='ordernumber' type='hidden' value="<%=baDaPay.getOrdernumber()%>" />
<input name='callbackurl' type='hidden' value="<%=baDaPay.getCallbackurl()%>" />
<input name='timestamp' type='hidden' value="<%=baDaPay.getTimestamp()%>" />
<input name='hrefbackurl' type='hidden' value="<%=baDaPay.getHrefbackurl()%>" />
<input name='goodsname' type='hidden' value="<%=baDaPay.getGoodsname()%>" />
<input name='memberId' type='hidden' value="<%=baDaPay.getMemberId()%>" />
<input name='attach' type='hidden' value="<%=baDaPay.getAttach()%>" />
<input name='sign' type='hidden' value="<%=baDaPay.getSign()%>" />
</TD>
</TR>
</TABLE>
</form>