1. 程式人生 > >第三方支付介面開發及開發中遇到的坑爹問題

第三方支付介面開發及開發中遇到的坑爹問題

前言

  最近在做公司的支付介面,從微信支付到各種第三方的支付介面,還有點卡等支付,微信支付文件相對比較詳細,雖然也不少坑,被各路開發人員吐槽,但是填的人多啊,所以是最好開發的,但是公司還有用到一些第三方的網頁支付介面,然後遇到很多坑,忍不住想吐槽一下。

一、第三方支付流程

  各種支付的文件,業務流程圖有的過於簡單,有的真的是複雜的不要不要的,開發者看了也是醉,寫這些文件的人好像從來不會考慮看的人的感受,所以我覺得有必要在這裡簡單介紹,我覺得給開發者的流程圖大致應該是這樣的,而不是一堆用不上的東西在開發文件裡面。

再簡單化就是:獲取介面資訊(銀行列表等)-》提交引數及簽名-》獲取結果(需要驗證簽名)

我們做介面開發  能力多麼強的程式設計師,不看文件也是沒有辦法做的,簽名演算法是人家做介面的人提供的,引數也是人家命名的,所以學會看文件是很重要的,看過大量別人寫的文件,我們才可以寫出簡單明瞭的文件了,這是經驗之談。

二、開發中遇到的那些坑

有寫坑是文件的坑,有些坑是人為的坑,反正坑你沒商量。

1.微信支付

  之前做微信支付,從官方文件下載了asp.net的開發demo,替換好了引數,按照官方的步驟一步一步來,想先測試支付成功後,再對接系統,坑的是我恰好用的是蘋果手機,恰好官方asp.net的demo裡面支付按鈕拖的是一個控制元件,在安卓上支付沒有問題,在蘋果手機上卻不可以,然後我再不知情的情況下我硬是搞了半天,看看程式碼註釋明顯不是C#的註釋方式,多半是做java的抓過來把java版本修改的。然後網上搜了一下,發現好多人被這個問題坑到!

2.環訊支付

  ①環訊支付提供了測試的商戶id和金鑰,並且提供了webservice介面獲取對應銀行的名稱和代號,方便開發直連支付模式,但是根據介面,獲取到的銀行列表的銀行代號竟然有重複的,我一直以為是我介面呼叫有問題,再三確認,真的是提供介面的太隨意了;②支付介面的商戶號下來了,我嘗試著去支付,改了正式的介面和商戶資訊,然後支付,結果連結失敗,錯誤碼#E008,我查文件,沒有,百度,沒有,找人問,不知道···然後我諮詢他們官方客服,官方客服轉接到技術客服,反正各種麻煩,對方說是域名沒繫結,我也是醉。公司讓我開發,就給了文件和商戶資訊,其他的都沒有,我以為只要微信才需要繫結域名呢。然後讓客服給個錯誤碼的文件,對方非要我提供商戶號才肯給····不知道這錯誤碼還是什麼機密麼?

3.新生支付

  ①這個官方提供的文件就更離譜了,我看了文件是2011年寫的,pdf是2013年生成的,然後上面也是提供了測試的地址,地址不是真的可訪問的地址,需要修改hosts檔案,重定向到指定的域名。我做好了準備測試的時候,發現一直提示網頁連結錯誤。納悶,當然我肯定是從自己身上找問題,是不是host檔案修改的不對,或者是其他什麼問題。經過我再三確認 各種ping 發現測試地址是不可用的,於是找度年,沒結果,問小夥伴,沒結果,好了,該去找官方客服,然後對接技術客服,問他們要最新的文件,及測試地址是換了麼?然後對方給我的答覆是測試地址是不可用的,我現在在用的文件(2011年寫的13年最後修改)是最新的,測試不可以用 你給各種測試的一堆東西幹嘛?

  ②直連的時候有個引數是必填的,使用者付款賬號,我覺得邏輯很奇怪,就問技術客服,結果對方給的答覆是隻要是郵箱和手機格式的,隨便填就可以···

  ③這個平臺沒有提供介面獲取銀行列表,所有的銀行引數都要手動寫,而且有變動的話也只能手動改!

4.關於文件

  不明白的點是官方網站上怎麼沒有網頁版的開發文件,word或者pdf方便,但是如果介面更新了什麼東西開發者第一時間怎麼修改呢?

三、案列程式碼

環訊支付的介面程式碼

1.獲取銀行列表

複製程式碼
 1 #region 環訊網銀支付介面 WebService獲取銀行列表資訊BankList()(暫時是測試的介面)
 2 PayServiceIps.ServiceSoapClient IpsPay = new PayServiceIps.ServiceSoapClient();//呼叫webservice 此處是測試地址
 3 protected List<string> Array;
 4 //獲取銀行列表
 5 //格式為  銀行|銀行別名|銀行代號的陣列
 6 protected List<string> BankList()
 7 {
 8     string Mer_code = System.Configuration.ConfigurationManager.AppSettings["Mer_code"];//商戶號
 9     string Mer_key = System.Configuration.ConfigurationManager.AppSettings["Mer_key"];//商戶證書:登陸http://merchant.ips.com.cn/商戶後臺下載的商戶證書內容
10     string Re = IpsPay.GetBankList(Mer_code, Game.Utils.Utility.MD5(Mer_code + Mer_key).ToLower());
11     Re = HttpUtility.UrlDecode(Re);//Re的格式為銀行|銀行別名|銀行代號#
12     List<string> ArrayList = new List<string>();
13     for (int i = 0; i < (Re.Split('#').Length - 1); i++)//陣列是以#結束的 所以最後一個字串是空的
14     {
15         ArrayList.Add(Re.Split('#')[i]);
16     }
17     return ArrayList;
18 }
19 #endregion
複製程式碼

2.支付跳轉到第三方頁面

複製程式碼
 1 #region 配置支付引數並且跳轉到支付
 2 //提交地址
 3 //string form_url = "http://pay.ips.net.cn/ipayment.aspx"; //測試
 4 string form_url = "https://pay.ips.com.cn/ipayment.aspx"; //正式
 5 //商戶號
 6 string Mer_code = System.Configuration.ConfigurationManager.AppSettings["Mer_code"];
 7 //商戶證書:登陸http://merchant.ips.com.cn/商戶後臺下載的商戶證書內容
 8 string Mer_key = System.Configuration.ConfigurationManager.AppSettings["Mer_key"];
 9 //商戶訂單編號
10 string Billno = orderInfo.OrderID;// 
11 //訂單金額(保留2位小數)
12 string Amount = this.txtSalePrice.Text.Trim() + ".00";
13 //訂單日期
14 string BillDate = DateTime.Now.ToString("yyyyMMdd");
15 //幣種
16 string Currency_Type = "RMB";
17 //支付卡種
18 string Gateway_Type = "01";
19 //銀行代號
20 string Bankco = Bankco;
21 //語言
22 string Lang = "GB";
23 string nurl = "http://" + Request.Url.Authority + "/Return.aspx";
24 //支付結果成功返回的商戶URL
25 string Merchanturl = nurl;
26 //支付結果失敗返回的商戶URL
27 string FailUrl = "http://" + Request.Url.Authority + "/FailUrl.aspx";
28 //商戶資料包
29 string Attach = Amount;
30 //顯示金額
31 string DispAmount = Amount;
32 //訂單支付介面加密方式
33 string OrderEncodeType = "5";
34 //交易返回介面加密方式 
35 string RetEncodeType = "17";
36 //返回方式
37 string Rettype = "1";
38 //Server to Server 返回頁面URL
39 string ServerUrl = nurl;
40 //訂單支付介面的Md5摘要, 原文=billno+訂單編號+ currencytype +幣種+ amount +訂單金額+ date +訂單日期+ orderencodetype +訂單支付介面加密方式+商戶內部證書字串
41 string SignMD5 = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile("billno" + Billno + "currencytype" + Currency_Type + "amount" + Amount + "date" + BillDate + "orderencodetype" + OrderEncodeType + Mer_key, "MD5").ToLower();
42 string postForm = "<form name=\"frm1\" id=\"frm1\" method=\"post\" action=\"" + form_url + "\">";
43 postForm += "<input type=\"hidden\" name=\"Mer_code\" value=\"" + Mer_code + "\" />";
44 postForm += "<input type=\"hidden\" name=\"Billno\" value=\"" + Billno + "\" />";
45 postForm += "<input type=\"hidden\" name=\"Amount\" value=\"" + Amount + "\" />";
46 postForm += "<input type=\"hidden\" name=\"Date\" value=\"" + BillDate + "\" />";
47 postForm += "<input type=\"hidden\" name=\"Currency_Type\" value=\"" + Currency_Type + "\" />";
48 postForm += "<input type=\"hidden\" name=\"Gateway_Type\" value=\"" + Gateway_Type + "\" />";
49 postForm += "<input type=\"hidden\" name=\"Lang\" value=\"" + Lang + "\" />";
50 postForm += "<input type=\"hidden\" name=\"Merchanturl\" value=\"" + Merchanturl + "\" />";
51 postForm += "<input type=\"hidden\" name=\"FailUrl\" value=\"" + FailUrl + "\" />";
52 postForm += "<input type=\"hidden\" name=\"Attach\" value=\"" + Attach + "\" />";
53 postForm += "<input type=\"hidden\" name=\"Bankco\" value=\"" + Bankco + "\" />";
54 postForm += "<input type=\"hidden\" name=\"DispAmount\" value=\"" + DispAmount + "\" />";
55 postForm += "<input type=\"hidden\" name=\"OrderEncodeType\" value=\"" + OrderEncodeType + "\" />";
56 postForm += "<input type=\"hidden\" name=\"RetEncodeType\" value=\"" + RetEncodeType + "\" />";
57 postForm += "<input type=\"hidden\" name=\"Rettype\" value=\"" + Rettype + "\" />";
58 postForm += "<input type=\"hidden\" name=\"ServerUrl\" value=\"" + ServerUrl + "\" />";
59 postForm += "<input type=\"hidden\" name=\"SignMD5\" value=\"" + SignMD5 + "\" />";
60 if (Bankco != "")
61     postForm += "<input type=\"hidden\" name=\"DoCredit\" value=\"1\">";
62 postForm += "</form>";
63 //自動提交該表單到測試閘道器
64 postForm += "<script type=\"text/javascript\" language=\"javascript\">setTimeout(\"document.getElementById('frm1').submit();\",10);</script>";
65 #endregion
複製程式碼

3.結果返回

複製程式碼
 1 //接收資料
 2 string billno = Request["billno"];
 3 string amount = Request["amount"];//+".00";
 4 string currency_type = Request["Currency_type"];
 5 string mydate = Request["date"];
 6 string succ = Request["succ"];
 7 string msg = Request["msg"];
 8 string attach = Request["attach"];
 9 string ipsbillno = Request["ipsbillno"];
10 string retEncodeType = Request["retencodetype"];
11 string signature = Request["signature"];
12 string bankbillno = Request["bankbillno"];
13 //簽名原文
14 //billno+【訂單編號】+currencytype+【幣種】+amount+【訂單金額】+date+【訂單日期】+succ+【成功標誌】+ipsbillno+【IPS訂單編號】+retencodetype +【交易返回簽名方式】
15 string content = "billno" + billno + "currencytype" + currency_type + "amount" + amount + "date" + mydate + "succ" + succ + "ipsbillno" + ipsbillno + "retencodetype" + retEncodeType;
16 //簽名是否正確
17 Boolean verify = false;
18 
19 //驗證方式:16-md5withRSA  17-md5
20 
21 // if (retEncodeType == "17")
22 //{
23 //登陸http://merchant.ips.com.cn/商戶後臺下載的商戶證書內容
24 string merchant_key = System.Configuration.ConfigurationManager.AppSettings["Mer_key"];
25 //Md5摘要
26 string signature1 = FormsAuthentication.HashPasswordForStoringInConfigFile(content + merchant_key, "MD5").ToLower();
27 
28 if (signature1 == signature)
29 {
30     verify = true;
31 }
32 
33 //判斷簽名驗證是否通過
34 if (verify == true)
35 {
36     //判斷交易是否成功
37     if (succ != "Y")
38     {
39         Response.Write("<script>alert(\"交易失敗!\");</script>");
40         Response.End();
41     }
42     else
43     {
44 
45         Response.Write("<script>alert(\"交易成功!\");</script>");
46         Response.End();
47     }
48 }
49 else
50 {
51     Response.Write("簽名不正確!");
52 }
複製程式碼

相關推薦

第三方支付介面開發開發遇到的問題

前言   最近在做公司的支付介面,從微信支付到各種第三方的支付介面,還有點卡等支付,微信支付文件相對比較詳細,雖然也不少坑,被各路開發人員吐槽,但是填的人多啊,所以是最好開發的,但是公司還有用到一些第三方的網頁支付介面,然後遇到很多坑,忍不住想吐槽一下。 一、第三方支付流程   各種支付的文件,業務流程圖有的

java開發 第三方支付 介面

alipay 的幾個核心功能檔案: ====================================================================================================== AlipayFunction.java [java]

專案開發管理:git的使用倉庫分支(Branch)和標籤(Tag)

專案開發及管理中:git的使用及倉庫分支(Branch)和標籤(Tag) 文章目錄 專案開發及管理中:git的使用及倉庫分支(Branch)和標籤(Tag) 1.git的使用 2.git分支 3.git標籤 轉載:https://

iOS開發 UI庫

製作UI庫中遇到編譯錯誤 file:///Users/lvshaohua/musicv/musicv/MVUPowerVUI/MVUPowerVUI/MVUCameraStoryboard.storyboard: error: IB Designa

iOS 開發之 內購 續篇

之前弄過一個內購買專案,然後總結了一些心得,最近又弄內購的過程中有發現了一些新問題, 就當時對之前的文章做個續篇吧. 之前的內購心得連結: http://blog.csdn.net/jesse0308/article/details/78458823 最近弄的內購專案是提供給接入方的

呼叫支付第三方支付介面詳解(沙箱環境)

首發地址:Java知音 注:這裡的支付是沙箱模擬支付 註冊螞蟻金服開放平臺 螞蟻金服開放平臺註冊地址 支付寶掃碼登陸 -> 註冊為自主研發者 2. 配置你的沙箱支付寶 支付寶提供一鍵生成工具便於開發者生成一對RSA2金鑰:https:

微信公眾號支付介面(vue專案,兩種方法)

第一種:引入微信js-sdk //在一個地方呼叫this.weixin()方法,比如說按鈕 //寫微信支付方法 weixin() { var that = this; var url=''; var params = {

第三方支付介面 支付通道 個人免籤支付 API介面

首先從事於第三方支付這份工作,為何這樣說,不管是您的現狀是好是壞,有沒有從這個行業賺得一桶金,我們不得不承認,電子商務這個大市場一天一天的在壯大。下面讓我們看下資料! 我國的電子商務經過近10年的發展,正處在理性價值迴歸與井噴應用發展的快車道上。管網際網路的商業

第三方支付介面蒐集

剛整理的幾個介面文件記錄 支付介面蒐集 08年1月 第三方支付介面 1.       快錢支付 2.       支付寶 3.       YeePay易寶 4.       郵局支付(網匯通) 5.       安付通 6.       網銀(chinabank) 7. 

一個關於第三方支付介面的面試題

因為我從事的工作跟要麼是第三方支付清結算系統,或者跟第三方支付,或者銀行介面相關的工作 前段時間面試的時候,遇到個問題,現在想想還是面試官思路是錯誤的。 他問我:對接第三方平臺的支付介面,對方返回了一個頁面怎麼辦。 我說:不可能啊,都是我們組裝個

電商平臺接入第三方支付介面之微信支付接入訂單系統

邊做邊更新……………… 先接入微信介面: 支付方式:使用者掃描二維碼支付 介面型別:掃碼支付之模式二 先copy一份模式二的業務流程時序圖 業務流程說明: (1)商戶後臺系統根據使用者

第三方支付平臺支付介面回撥介面開發

作為開放式的B/S架構程式,無論所屬電商,金融,機械製造,企業OA,ERP,CRM,CMS等等行業或系統中,第三方支付以及銀聯支付的業務一定是客戶關心所在,也是保證客戶系統盈利運營的一個重要保障。通常這種B2C或者C2C系統的開發,商戶使用者所關注的支付平臺大多離不開“阿里支付寶,快錢,騰訊財付通,易寶支

25、【支付模組開發】——將配置好的支付寶沙箱環境整合到我們的專案以及支付介面的編寫

####1、將支付寶Demo中的相關檔案複製到我們的專案中: 首先,我們將Demo中src中的包及裡面的檔案複製到我們專案中 同樣,我們也要講zhifubao.properties這個配置檔案方法我們專案中的 resources目錄下: 加下來就是我們的jar包了~ 首先我們先在

工行線上支付介面實戰開發流程原始碼

前期準備 支付元件註冊(PS:當時工行技術根本沒有給我這個元件,被坑了,當時還想罵那個技術一下,簽名什麼的,難道我隨便按照自己的想法籤一個也可以?後來終於給我了) 元件註冊說明 一、API配置說明: 1.將ICBCEBankUtil.dll和infosecapi.dll兩個d

Android開發第三方支付SDK的接入與使用(支付寶+微信支付+銀聯)

支付寶微信銀行卡支付SDK接入 支付寶支付: 一.  繫結前提: 我們自己要和支付寶簽約(商戶簽約).-->運營完成 祕鑰配置-->協助運營完成祕鑰的配置(公鑰互換),可能程式設計師會參與 整合支付寶-->必須是程式設計師去做二.  繫結步驟 整合呼叫支付

電子商務平臺支付介面開發原理流程

隨著電子商務行業的發展,很多中小企業也加入了電子商務大軍,實現電子商務非常重要的一個需求就是有一個強大的電子商務網站平臺,用於對企業電子商務相關產品、服務進行管理等操作。而完成整個電子商務流程最不能越少的環節就是收款,通過網路,將商品、服務的款項支付給電子商務平臺的所有者。

【1】從零開始做第三方支付開發-----初步了解概念

用例 深入 hub 編寫 不知道 了解 程序員 系列 bsp 這是第三方支付開發的第一篇. 目前很多公司在做海外支付, 但是不知道怎麽開始. 本人公司就是做海外產品, 涉及到paypal和stripe支付, 有比較多的經驗, 希望可以幫助需要的朋友. 我是做Java開發,

PEP8編碼規範,開發的一些慣例和建議

ret mar 小寫 比較運算 -c 包含 user def 有意 為什麽要有編碼規範   規範的代碼給人的第一感覺是【美觀】,美的東西總是更加的吸引人,也願意觀看。亂糟糟得是不是會讓人不由自主地想飆臟話。所以美觀進而帶來的是代碼的【可讀性】強,想一想你寫的代碼可讀性非常高

PEP8 編碼規範, 開發的?一些慣例例和建議

urn 命名 體積 size family 數學運算 lint 字母 style 首先看下面這段代碼,是否滿足編碼規範 1 from django.conf import settings 2 from user.models import * 3 imp

php微信支付介面開發,獲取php微信掃碼支付返回結果,php開發微信支付demo原始碼

現在很多網站都是用php開發的, 一些觀看了子恆老師微信公眾號運營視訊後, 想要更加深入的學習, 留言說“php怎麼做微信支付介面開發呢?” “有沒有php微信支付介面開發的demo例項” 下面來詳細談談… 一、 php微信支付介面開發要做的準備 只有你先準備配置好, 然後才能正確