说说第三方支付接口开发及开发中遇到的坑爹问题

前言

最近在做公司的支付接口,从微信支付到各种第三方的支付接口,还有点卡等支付,微信支付文档相对比较详细,虽然也不少坑,被各路开发人员吐槽,但是填的人多啊,所以是最好开发的,但是公司还有用到一些第三方的网页支付接口,然后遇到很多坑,忍不住想吐槽一下。

一、第三方支付流程

各种支付的文档,业务流程图有的过于简单,有的真的是复杂的不要不要的,开发者看了也是醉,写这些文档的人好像从来不会考虑看的人的感受,所以我觉得有必要在这里简单介绍,我觉得给开发者的流程图大致应该是这样的,而不是一堆用不上的东西在开发文档里面。

再简单化就是:获取接口信息(银行列表等)-》提交参数及签名-》获取结果(需要验证签名)

我们做接口开发  能力多么强的程序员,不看文档也是没有办法做的,签名算法是人家做接口的人提供的,参数也是人家命名的,所以学会看文档是很重要的,看过大量别人写的文档,我们才可以写出简单明了的文档了,这是经验之谈。

二、开发中遇到的那些坑

有写坑是文档的坑,有些坑是人为的坑,反正坑你没商量。

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 }

时间: 2024-10-08 23:50:07

说说第三方支付接口开发及开发中遇到的坑爹问题的相关文章

对接第三方支付接口-记录

对接支付接口,得知这种第三方的支付接口的对接方式一般为:组装接口需要的参数,以json数据格式或者其他格式(大多数为json),请求第三方支付接口的url,并且将回调的通知地址放在参数中,等支付完成后,一般成功后会异步请求这个通知接口,会返回相应的数据给系统做一系列的数据操作,然后返回一个成功状态.这样一次第三方支付接口的请求算结束. 由于这次是与APP端开发人员对接,场景为:用户在APP上进行还款操作,APP开发人员将该期还款计划的id和还款方式(主动还款/代扣)传给后台,后台服务端将传递的参

第三方支付接口现号,第三方支付接口对接,第三方支付接口申请

第三方支付公司太多,到目前为止一共有5批206家拿牌支付公司:国付宝,支付宝,环迅,汇潮,易宝,快钱,智付,等等不管您从事与哪家,我们都必须面对这些事实,每家支付公司都有自己的优势跟劣势. 目前国家对第三方支付平台的管控越来越严格,导致目前第三方支付平台的申请越来越严格.特别是对一些个别行业,申请更是难上加难.如果在申请第三方支付平台的过程中需要帮助,请您联系我.QQ:804752009 各类第三方支付接口,包括(支付宝,微信扫码,银盛,商银信,创瑞宝,易通,易宝,国付宝,多付宝,彩虹支付,锐付

B2B商城电子商务平台网上商城系统支付通道申请第三方支付接口对接搭建 支付宝微信扫码网关网银银联快捷支付

需要了解 JR金融项目 区块链,比特币,p2p项目,B2B网关,现货资金盘,期货招商,股票配资,商品交易所 大盘的 金融支付 第三方支付,网关支付,网银支付,银行卡支付,话费卡支付,银联代扣,支付渠道,支付宝支付,微信支付,扫码支付,快捷支付,支付牌照申请,线上支付通道搭建,支付通道申请,支付接口对接,原生支付宝网关支付!独立后台,D0实时结算,API批量代付接口 JR / BC / QP 菠菜奔驰游戏等稳定安全通道!大量三方支付资质出售!请加QQ 2954704394 近年来,第三方支付发展势

第三方支付接口哪家好怎么选择

第三方支付接口哪家好怎么选 第三方支付接口哪家好怎么选,今天小编带大家详细了解下                              支付通道咨询:QQ2119017259:手机VX: 13360876492 随着无线通信网络的发展,特别是苹果iPhone和谷歌Android智能手机的迅速普及,移动支付的发展得到了推动.根据数据研究公司IDC的数据,2017年全球移动支付金额将超过1万亿美元.强劲的数据意味着未来几年全球移动支付业务将继续增强. 移动支付主要分为近场支付和远程支付.所谓的近

BTC比特币币圈金融资金盘系统定制支付通道申请第三方支付接口对接搭建 支付宝微信扫码网关网银银联快捷支付

需要了解 JR金融项目 区块链,比特币,p2p项目,B2B网关,现货资金盘,期货招商,股票配资,商品交易所 大盘的 金融支付 第三方支付,网关支付,网银支付,银行卡支付,话费卡支付,银联代扣,支付渠道,支付宝支付,微信支付,扫码支付,快捷支付,支付牌照申请,线上支付通道搭建,支付通道申请,支付接口对接,原生支付宝网关支付!独立后台,D0实时结算,API批量代付接口 JR / BC / QP 菠菜奔驰游戏等稳定安全通道!大量三方支付资质出售!请加QQ 2954704394 三方支付平台希望发展,只

对接第三方支付接口-类似文件锁的编程小技巧

在这次对接支付接口的时候,有如下场景:用户还款的时候,APP端只要请求了支付接口后,正常情况下,支付接口会同步返回结果状态,并且异步通知是否成功,支付状态以异步通知为准.这样的场景会出现一个问题,如果APP端请求了支付接口,异步通知迟迟未返回,这样一来,用户还款状态是无法更改(还款的逻辑处理实在异步通知里处理,因为一切以异步通知为准),并且对于用户来说他已经还款了,异步回调没来,可能支付成功,可能支付失败我们不知道,对于用户来说他已经支付还款了,按逻辑这一期还款他无需也不能做其他操作了,所以在回

游戏开发金融平台怎么对接支付平台第三方支付怎么申请接口对接

些年来第三方支付发展得非常迅速,第三方支付已经普及到各行各业中了,尤其是游戏行业,现在很多的游戏都是有充值系统的,而充值系统就是使用第三方支付的,下面小编就给大家介绍一下网络游戏申请第三方支付接口吧! 网络游戏申请第三方支付接口 网络游戏申请第三方支付接口 支付宝申请条件 1.如果您是个人签约,需要满足合作六个月以上,近三个月全部成功交易大于1000笔,金额超过5万元. 2.申请支付宝接口的需要提供淘宝同名店铺链接地址或者已经签约的支付宝及时到账.担保交易.双功能收款中的任何一款产品. 3.需要

支付宝在线支付接口开发教程

1.什么是第三方支付 所谓第三方支付,就是一些和各大银行签约.并具备一定实力和信誉保障的第三方独立机构提供的交易支持平台.在通过第三方支付平台的交易中,买方选购商品后,使用第三方平台提供的账户进行货款支付,由第三方通知卖家货款到达. 目前提供第三方支付的机构很多,常见的有支付宝.财付通.快钱.网银在线.易宝支付.云网等各大支付平台.网站如果需要实现第三方支付首先应该向第三方支付平台申请一个账号并签署协议,协议生效后第三方支付平台将为其开通在线支付功能,通过程序将接口集成到网站中. 为什么要使用第

支付宝在线支付接口开发流程

本文转自:https://www.cnblogs.com/lazb/p/5881678.html 1.什么是第三方支付 所谓第三方支付,就是一些和各大银行签约.并具备一定实力和信誉保障的第三方独立机构提供的交易支持平台.在通过第三方支付平台的交易中,买方选购商品后,使用第三方平台提供的账户进行货款支付,由第三方通知卖家货款到达. 目前提供第三方支付的机构很多,常见的有支付宝.财付通.快钱.网银在线.易宝支付.云网等各大支付平台.网站如果需要实现第三方支付首先应该向第三方支付平台申请一个账号并签署