第三方支付接口技术对接实现与样例

合集下载

第三方支付接口技术对接实现及样例

第三方支付接口技术对接实现及样例

第三方支付接口技术对接实现及样例随着电子商务和移动支付的蓬勃发展,第三方支付成为了一种便捷、安全的支付方式。

第三方支付接口技术对接实现是指将第三方支付平台的支付功能引入到自己的平台中,使用户可以直接在自己的平台上完成支付操作。

本文将介绍第三方支付接口技术对接的实现步骤,并提供一个简单的样例演示。

一.实现步骤1. 选择第三方支付平台2. 获取商户账号和密钥注册第三方支付平台的商户账号,并获取对应的商户密钥。

商户账号和密钥用于身份验证和加密等操作。

3. 接口文档阅读仔细阅读第三方支付平台提供的接口文档,了解接口的功能和使用方式。

接口文档中通常包含接口的请求参数、返回参数、加密方式、签名算法等关键信息。

4. 接口参数配置根据接口文档配置请求参数。

一般需要配置商户账号、订单号、金额、支付方式等基本参数。

5. 发起支付请求根据接口文档的要求,利用开发语言发送请求到第三方支付平台。

请求可以使用HTTP或者HTTPS协议进行传输。

请求中需要包含商户账号、密钥等身份验证参数,同时还需要传递订单信息和支付金额等相关参数。

6. 处理支付结果7. 订单查询和退款如果需要查询订单状态或者发起退款操作,可以通过调用第三方支付平台的查询接口或者退款接口实现。

二.样例演示假设我们选择支付宝作为第三方支付平台,演示如何使用支付宝支付接口。

1. 注册支付宝商户账号并获取密钥。

2. 阅读支付宝开放平台的接口文档。

3. 配置请求参数。

例如,在发起支付请求时,我们需要配置商户账号、订单号、金额等参数。

4. 调用支付宝的支付接口,向支付宝传递请求参数。

```javapublic class AlipayDemopublic static void main(String[] args)//配置请求参数String appId = "YOUR_APP_ID";String merchantId = "YOUR_MERCHANT_ID"; double amount = 100.0;//构造请求URL//发起支付请求String result = sendRequest(url);//处理支付结果if (result.equals("success"))System.out.println("支付成功!");} elseSystem.out.println("支付失败!");}}private static String sendRequest(String url) //发送HTTP请求,并获取服务器响应//TODO:发送HTTP请求的代码...return "success"; // 假设返回结果为成功}```以上代码演示了如何使用支付宝支付接口,其中`sendRequest`方法需要根据具体的编程语言和第三方支付平台的要求实现。

支付接口

支付接口

1 支付接口定义及实现图1 第三方支付接口示意图(来源:本研究整理)1.1支付接口定义从技术角度讲,支付接口就是第三方支付平台提供的一段代码,商务需要将该代码配置到自己的服务器上去,并设置一些相关的接口参数。

那么当客户选择使用第三方支付时,支付信息就会转到第三方支付平台的服务器上运行。

具体来看,使用支付接口完成的支付流程如下:(1)持卡客户(买方)选购好商品后,网上商城(卖方)为持卡客户生成订单;(2)持卡客户和第三方服务器建立连接,将账号信息与订单信息发给第三方;(3)第三方服务器要求顾客进行订单确认,收到确认信息后与所支持的银行进行支付交易处理,得到银行的支付确认后授权给商家可以发货;(4)网上商城通知持卡客户发货信息。

图2 第三方支付流程图(来源:本研究整理)1.2支付接口实现1.2.1实现条件要实现接口,需要有一个网站、支付宝账户、支付宝的合作身份ID、安全校验码等。

为了方便电子商务网站的集成,各支付网关在正式成为商家用户后,可下载ASP、.NET、JAVA等针对不同服务器类型的商务网站的集成接口程序。

本文将分别以各种有代表性的第三方支付平台为例说明与JSP类型的电子商务网站的接口应用方法。

值得注意的是,参数简单的传过去是不行的,这些参数是经过了按一定排列顺序并区分大小写(参数为空也要传递)再加上一个MD5字符串。

即使参数值为空字符串和没有传值也是有区别。

1.2.2实现过程比如现在有一个页面要向第三方支付平台传递一个价格跟商品信息,则可以通过POST和GET两种方式传递进去。

当第三方支付平台接收参数的同时,它还要判断身份,所以传递的时候身份信息也要一起传过去。

当身份确认以后,第三方支付平台就开始处理商品信息跟价格信息了。

无论消费者是否支付成功,它都会返回一个信息给消费者,这个返回页面就是第三方支付平台之前设置好了的,在这个返回页面里面写入相关的支付数据信息,这样就完成了一个简单支付接口。

java支付宝第三方即时到账支付接口

java支付宝第三方即时到账支付接口

java⽀付宝第三⽅即时到账⽀付接⼝alipay 的⼏个内核功能⽂件:====================================================================================================== AlipayFunction.java1. package com.test.util.alipay;2.3.4. import java.io.FileWriter;5. import java.io.IOException;6. import .MalformedURLException;7. import .URL;8. import java.util.ArrayList;9. import java.util.Collections;10. import java.util.HashMap;11. import java.util.List;12. import java.util.Map;13.14. import org.dom4j.Document;15. import org.dom4j.DocumentException;16. import org.dom4j.Node;17. import org.dom4j.io.SAXReader;18.19.20.21.22. public class AlipayFunction {23. /**24. * 功能:⽣成签名结果25. * @param sArray 要签名的数组26. * @param key 安全校验码27. * @return 签名结果字符串28. */29. public static String BuildMysign(Map sArray, String key) {30. String prestr = CreateLinkString(sArray); //把数组所有元素,按照“参数=参数值”的模式⽤“&”字符拼接成字符串31. prestr = prestr + key; //把拼接后的字符串再与安全校验码直接连接起来32. String mysign = Md5Encrypt.md5(prestr);33. return mysign;34. }35.36. /**37. * 功能:除去数组中的空值和签名参数38. * @param sArray 签名参数组39. * @return 去掉空值与签名参数后的新签名参数组40. */41. public static Map ParaFilter(Map sArray){42. List keys = new ArrayList(sArray.keySet());43. Map sArrayNew = new HashMap();44.45. for(int i = 0; i < keys.size(); i++){46. String key = (String) keys.get(i);47. String value = (String) sArray.get(key);48.49. if( value == null || value.equals("") ||50. key.equalsIgnoreCase("sign") || key.equalsIgnoreCase("sign_type")){51. continue;52. }53.54. sArrayNew.put(key, value);55. }56.57. return sArrayNew;58. }59.60. /**61. * 功能:把数组所有元素排序,并按照“参数=参数值”的模式⽤“&”字符拼接成字符串62. * @param params 需要排序并参与字符拼接的参数组63. * @return 拼接后字符串64. */65. public static String CreateLinkString(Map params){66. List keys = new ArrayList(params.keySet());67. Collections.sort(keys);68.69. String prestr = "";70.71. for (int i = 0; i < keys.size(); i++) {72. String key = (String) keys.get(i);73. String value = (String) params.get(key);74.75. if (i == keys.size() - 1) {//拼接时,不包括最后⼀个&字符76. prestr = prestr + key + "=" + value;77. } else {78. prestr = prestr + key + "=" + value + "&";79. }80. }81.82. return prestr;83. }84.85. /**86. * 功能:写⽇志,⽅便测试(看⽹站需求,也可以改成把记录存⼊数据库)87. * @param sWord 要写⼊⽇志⾥的⽂本内容88. */89. public static void LogResult(String sWord){90. // 该⽂件存在于和应⽤服务器启动⽂件同⼀⽬录下,⽂件名是alipay log加服务器时间91. try {92. FileWriter writer = new FileWriter("D:\\alipay_log" + System.currentTimeMillis() + ".txt");93. writer.write(sWord);94. writer.close();95. } catch (Exception e) {96. e.printStackTrace();97. }98. }99.100. /**101. * 功能:⽤于防钓鱼,调⽤接⼝query_timestamp来获取时间戳的处理函数102. * 注意:远程解析XML出错,与服务器是否⽀持SSL等配置有关103. * @param partner 合作⾝份者ID104. * @return 时间戳字符串105. * @throws IOException106. * @throws DocumentException107. * @throws MalformedURLException108. */109.110. public static String query_timestamp(String partner)111. throws MalformedURLException, DocumentException, IOException {112. String strUrl = "https:///gateway.do?service=query_timestamp&partner="+partner; 113. StringBuffer buf1 = new StringBuffer();114. SAXReader reader = new SAXReader();115. Document doc = reader.read(new URL(strUrl).openStream());116.117. List<Node> nodeList = doc.selectNodes("//alipay/*");118.119. for (Node node : nodeList) {120. // 截取部分不需要解析的信息121. if (node.getName().equals("is_success")122. && node.getText().equals("T")) {123. // 判断是否有成功标⽰124. List<Node> nodeList1 = doc.selectNodes("//response/timestamp/*");125. for (Node node1 : nodeList1) {126. buf1.append(node1.getText());127. }128. }129. }130.131. return buf1.toString();132. }133. }====================================================================================================== AlipayNotify.java1. package com.test.util.alipay;2.3. import java.io.BufferedReader;4. import java.io.InputStreamReader;5. import .HttpURLConnection;6. import .URL;7. import java.util.Map;8.9. import com.test.constants.AlipayConfig;10.11.12. public class AlipayNotify {13. /**14. * *功能:根据反馈回来的信息,⽣成签名结果15. * @param Params 通知返回来的参数数组16. * @param key 安全校验码17. * @return ⽣成的签名结果18. */19. public static String GetMysign(Map Params, String key){20. Map sParaNew = AlipayFunction.ParaFilter(Params);//过滤空值、sign与sign_type参数21. String mysign = AlipayFunction.BuildMysign(sParaNew, key);//获得签名结果22.23. return mysign;24. }25.26. /**27. * *功能:获取远程服务器ATN结果,验证返回URL28. * @param notify_id 通知校验ID29. * @return 服务器ATN结果30. * 验证结果集:31. * invalid命令参数不对出现这个错误,请检测返回处理中partner和key是否为空32. * true 返回正确信息33. * false 请检查防⽕墙或者是服务器阻⽌端⼝问题以及验证时间是否超过⼀分钟34. */35. public static String Verify(String notify_id){36. //获取远程服务器ATN结果,验证是否是⽀付宝服务器发来的请求37. String transport = AlipayConfig.transport;38. String partner = AlipayConfig.partner;39. String veryfy_url = "";40. if(transport.equalsIgnoreCase("https")){41. veryfy_url = "https:///cooperate/gateway.do?service=notify_verify";42. } else{43. veryfy_url = "/trade/notify_query.do?";44. }45. veryfy_url = veryfy_url + "&partner=" + partner + "¬ify_id=" + notify_id;46.47. String responseTxt = CheckUrl(veryfy_url);48.49. return responseTxt;50. }51.52. /**53. * *功能:获取远程服务器ATN结果54. * @param urlvalue 指定URL路径地址55. * @return 服务器ATN结果56. * 验证结果集:57. * invalid命令参数不对出现这个错误,请检测返回处理中partner和key是否为空58. * true 返回正确信息59. * false 请检查防⽕墙或者是服务器阻⽌端⼝问题以及验证时间是否超过⼀分钟60. */61. public static String CheckUrl(String urlvalue){62. String inputLine = "";63.64. try {65. URL url = new URL(urlvalue);66. HttpURLConnection urlConnection = (HttpURLConnection) url67. .openConnection();68. BufferedReader in = new BufferedReader(new InputStreamReader(69. urlConnection.getInputStream()));70. inputLine = in.readLine().toString();71. } catch (Exception e) {72. e.printStackTrace();73. }74.75. return inputLine;76. }77. }====================================================================================================== AlipayService.java1. package com.test.util.alipay;2.3. import java.util.ArrayList;4. import java.util.HashMap;5. import java.util.List;6. import java.util.Map;7.8.9. public class AlipayService {10. /**11. * 功能:构造表单提交HTML12. * @param partner 合作⾝份者ID13. * @param seller_email 签约⽀付宝账号或卖家⽀付宝帐户14. * @param return_url 付完款后跳转的页⾯要⽤以http开头格式的完整路径,不允许加?id=123这类⾃定义参数15. * @param notify_url 交易过程中服务器通知的页⾯要⽤以http开格式的完整路径,不允许加?id=123这类⾃定义参数16. * @param show_url ⽹站商品的展⽰地址,不允许加?id=123这类⾃定义参数17. * @param out_trade_no 请与贵⽹站订单系统中的唯⼀订单号匹配18. * @param subject 订单名称,显⽰在⽀付宝收银台⾥的“商品名称”⾥,显⽰在⽀付宝的交易管理的“商品名称”的列表⾥。

一种通用的支付渠道对接方法

一种通用的支付渠道对接方法

一种通用的支付渠道对接方法
一种通用的支付渠道对接方法是通过使用第三方支付聚合平台来完成,这种平台会将各种支付渠道整合在一起,商户只需要通过接口调用就可以
实现多种支付方式的接入。

下面将详细介绍这种通用的支付渠道对接方法
的流程和步骤。

然后,商户需要配置支付接口的相关参数,如商户密钥、支付回调地
址等。

商户密钥用于保证交易数据的安全性,支付回调地址用于接收支付
结果通知。

商户还可以设置一些其他参数,如支付限额、支付手续费等。

完成接口配置后,商户需要根据第三方支付聚合平台提供的接口文档
进行开发工作。

商户需要按照接口文档的要求调用相应的接口,并将支付
相关的参数传递给第三方支付聚合平台。

一般来说,支付接口的调用方式
有两种,一种是使用表单提交,另一种是使用API调用。

商户可以根据自
己的需求选择适合的方式。

最后,商户需要进行测试和联调工作。

商户可以使用第三方支付聚合
平台提供的模拟支付环境进行测试,以验证支付功能的正确性和稳定性。

同时,商户还需要与第三方支付平台进行联调,以确保支付数据能够正常
传递和处理。

综上所述,一种通用的支付渠道对接方法通过使用第三方支付聚合平
台来完成。

这种方法可以帮助商户快速接入各种支付平台,并且大大减少
对接的难度和成本。

商户只需要注册账号、进行接口设置、配置相关参数、进行开发和测试联调等几个步骤,就可以实现在线支付功能。

这种通用的
支付渠道对接方法在提高支付效率和方便商户的支付操作方面具有非常重
要的意义。

一种通用的支付渠道对接方法

一种通用的支付渠道对接方法

一种通用的支付渠道对接方法(原创版3篇)目录(篇1)I.支付渠道对接方法的概念和意义II.支付渠道对接方法的具体实现步骤III.支付渠道对接方法的应用场景和优势IV.支付渠道对接方法的未来发展趋势正文(篇1)一、支付渠道对接方法的概念和意义支付渠道对接方法是一种通过将不同的支付渠道集成在一起,实现快速、安全、便捷的支付方式。

这种方法的出现为商户提供了更多的支付选择,同时也为消费者带来了更多的便利。

对于商户来说,使用支付渠道对接方法可以降低支付成本,提高支付效率;对于消费者来说,使用这种方法可以更加方便快捷地完成支付,提高消费体验。

二、支付渠道对接方法的具体实现步骤1.确定需要对接的支付渠道:首先需要确定需要对接的支付渠道,包括支付宝、微信支付、银联等。

2.接入支付渠道:通过API接口或SDK等方式接入支付渠道,实现与支付渠道的互通。

3.集成支付渠道:将不同的支付渠道集成在一起,实现快速、安全、便捷的支付方式。

4.测试和调试:对集成后的支付方式进行测试和调试,确保其正常运行。

三、支付渠道对接方法的应用场景和优势1.应用场景:在各种线上线下的交易场景中都可以使用支付渠道对接方法,例如电商平台、实体店、游戏平台等。

2.优势:支付渠道对接方法具有以下优势:(1)兼容性强:可以集成各种不同的支付渠道;(2)快速:可以实现快速支付;(3)安全:通过安全认证机制,保证支付安全;(4)便捷:提供多种支付方式选择,方便消费者完成支付。

四、支付渠道对接方法的未来发展趋势1.更加智能化:随着人工智能技术的发展,未来支付渠道对接方法将更加智能化,能够自动识别消费者的支付习惯,提供更加个性化的支付服务。

目录(篇2)I.支付渠道对接方法的重要性II.支付渠道对接方法的基本原理III.支付渠道对接方法的应用场景IV.支付渠道对接方法的实现方式正文(篇2)支付渠道对接方法在现代商业中具有重要作用,它可以提高支付效率,降低交易成本,提升客户体验。

有关第三方支付合作协议范本新9篇

有关第三方支付合作协议范本新9篇

有关第三方支付合作协议范本新9篇第1篇示例:第三方支付合作协议范本甲方:(公司名称)地址:(公司地址)法定代表人:(法定代表人姓名)联系方式:(联系方式)鉴于甲方为一家具有良好信誉和声誉的企业,致力于(主营业务),乙方为一家具有先进的支付服务技术和丰富的支付经验的第三方支付平台,双方本着互利共赢的原则,就合作推进支付服务业务,达成如下协议:一、合作内容1. 乙方为甲方提供支付服务,包括但不限于线上支付、线下支付等。

2. 甲方接受乙方提供的支付服务,并按照相关协议支付相应的费用。

3. 双方共同合作推广支付业务,共同提升支付服务品质和用户体验。

二、权利与义务1. 甲方有权享受乙方提供的支付服务,并有义务按照约定支付相应费用。

2. 乙方有权根据实际情况对支付服务进行调整和升级,同时有义务确保支付服务的安全和稳定。

3. 双方有义务对合作过程中的数据和信息进行保密,不得泄露给第三方。

4. 双方有义务及时协商解决合作中出现的问题,并共同维护合作关系的稳定和持续发展。

三、费用支付1. 甲方应按照约定支付乙方合作费用,具体费用标准由双方协商确定。

2. 乙方应按照约定向甲方提供相应的费用发票。

四、保密条款1. 双方在合作过程中涉及的商业机密、技术资料等信息,均应保密不得外泄。

2. 未经对方书面许可,任何一方不得将合作信息透露给第三方。

3. 合作结束后,双方应妥善处理已获取的信息,不得继续使用。

五、违约责任1. 任何一方未按照约定履行义务,构成违约的,应承担相应的法律责任。

2. 如因一方违约造成另一方损失的,违约方应承担全部赔偿责任。

六、合作期限本协议自双方签署之日起生效,至双方协商终止为止。

七、其他条款1. 本协议经双方签字盖章后生效,具有法律效力。

2. 对本协议的解释和争议解决均适用中华人民共和国法律。

甲方(盖章):乙方(盖章):签署日期:签署日期:以上为《第三方支付合作协议范本》,由甲乙双方认真阅读并签字确认,愿为双方合作的共同发展努力。

技术接口对接合同模板

技术接口对接合同模板

技术接口对接合同模板合同编号:_____________甲方(提供方):____________________乙方(接收方):____________________签订日期:____年____月____日鉴于甲方拥有_________技术接口,乙方需要使用该技术接口以实现业务功能,双方本着互利互惠的原则,经友好协商,就技术接口对接事宜达成如下合同条款:第一条定义1.1 技术接口:指甲方提供的,乙方用于实现特定业务功能的技术连接点。

1.2 接口文档:指甲方提供的关于技术接口的详细说明,包括但不限于接口规范、调用方式、参数说明等。

1.3 接口服务:指甲方根据本合同向乙方提供的技术接口使用服务。

第二条接口服务内容2.1 甲方同意向乙方提供_________技术接口,并确保该接口的可用性和稳定性。

2.2 甲方应向乙方提供完整的接口文档,并在接口更新时及时通知乙方。

第三条接口使用范围3.1 乙方有权在合同约定的范围内使用甲方提供的技术接口。

3.2 乙方不得将接口用于任何非法或违反合同目的的活动。

第四条接口使用费用4.1 乙方应按照本合同约定向甲方支付接口使用费用,具体金额为_________。

4.2 接口使用费用的支付方式为_________。

第五条技术支持与维护5.1 甲方应提供必要的技术支持,协助乙方正确使用技术接口。

5.2 甲方应保证技术接口的正常运行,并在发现问题时及时修复。

第六条保密条款6.1 双方应对在合同履行过程中知悉的对方商业秘密予以保密。

6.2 未经对方书面同意,任何一方不得向第三方披露、泄露或允许第三方使用该等商业秘密。

第七条违约责任7.1 如一方违反合同条款,应承担违约责任,并赔偿对方因此遭受的损失。

7.2 因不可抗力导致不能履行或完全履行合同的,双方互不承担违约责任。

第八条合同变更和解除8.1 合同一经签订,未经双方协商一致,任何一方不得擅自变更或解除合同。

8.2 如一方需变更或解除合同,应提前____天书面通知对方,并说明理由。

三分钟python搭建支付宝三方支付

三分钟python搭建支付宝三方支付

三分钟python搭建⽀付宝三⽅⽀付⽬录为什么使⽤三⽅⽀付?⽀付宝⽀付的流程配置流程1、获取APPID2、在线⽣成密钥3、获取公钥python项⽬中集成⽀付宝总结为什么使⽤三⽅⽀付? 再没有三⽅⽀付平台之前,⽤户发起⽀付请求的时候,⽤户要去和银⾏签约(转账),特别的不⽅便,为了解决这些问题,就有了三⽅⽀付,三⽅平台去完成签约,给⽤户节省时间。

⽀付宝⽀付的流程 商户拿到⽀付宝的公钥、⾃⼰的私钥(私钥加密、公钥解密),⽤私钥请求⽀付宝,⽀付宝解密、验签、进⾏⽀付处理,⽀付宝将处理的返回值传给商户,当⽀付成功后,返还给商户订单号、⾦额、时间戳等消息,⽀付失败后同样给商户反馈结果。

配置流程1、获取APPID登录⽀付宝开放平台–>点击控制台点击沙箱(复制APPID)2、在线⽣成密钥点击⽂档,找到开发助⼿,点击在线加密。

3、获取公钥点击应⽤公钥现在已经拿到了需要的公钥。

python项⽬中集成⽀付宝构建⽀付类from datetime import datetimefrom Crypto.PublicKey import RSAfrom Crypto.Signature import PKCS1_v1_5from Crypto.Hash import SHA256from urllib.parse import quote_plusfrom base64 import decodebytes, encodebytesimport jsonclass AliPay:"""⽀付宝⽀付接⼝(PC端⽀付接⼝)"""def __init__(self, appid, app_notify_url, app_private_key_path,alipay_public_key_path, return_url, debug=False):self.appid = appidself.app_notify_url = app_notify_urlself.app_private_key_path = app_private_key_pathself.app_private_key = Noneself.return_url = return_urlwith open(self.app_private_key_path) as fp:self.app_private_key = RSA.importKey(fp.read())self.alipay_public_key_path = alipay_public_key_pathwith open(self.alipay_public_key_path) as fp:self.alipay_public_key = RSA.importKey(fp.read())if debug is True:self.__gateway = "https:///gateway.do"else:self.__gateway = "https:///gateway.do"def direct_pay(self, subject, out_trade_no, total_amount, return_url=None, **kwargs): biz_content = {"subject": subject,"out_trade_no": out_trade_no,"total_amount": total_amount,"product_code": "FAST_INSTANT_TRADE_PAY",}biz_content.update(kwargs)data = self.build_body("alipay.trade.page.pay", biz_content, self.return_url)return self.sign_data(data)def build_body(self, method, biz_content, return_url=None):data = {"app_id": self.appid,"method": method,"charset": "utf-8","sign_type": "RSA2","timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),"version": "1.0","biz_content": biz_content}def sign_data(self, data):data.pop("sign", None)unsigned_items = self.ordered_data(data)unsigned_string = "&".join("{0}={1}".format(k, v) for k, v in unsigned_items)sign = self.sign(unsigned_string.encode("utf-8"))quoted_string = "&".join("{0}={1}".format(k, quote_plus(v)) for k, v in unsigned_items)signed_string = quoted_string + "&sign=" + quote_plus(sign)return signed_stringdef ordered_data(self, data):complex_keys = []for key, value in data.items():if isinstance(value, dict):complex_keys.append(key)for key in complex_keys:data[key] = json.dumps(data[key], separators=(',', ':'))return sorted([(k, v) for k, v in data.items()])def sign(self, unsigned_string):key = self.app_private_keysigner = PKCS1_v1_5.new(key)signature = signer.sign(SHA256.new(unsigned_string))sign = encodebytes(signature).decode("utf8").replace("\n", "")return signdef _verify(self, raw_content, signature):key = self.alipay_public_keysigner = PKCS1_v1_5.new(key)digest = SHA256.new()digest.update(raw_content.encode("utf8"))if signer.verify(digest, decodebytes(signature.encode("utf8"))):return Truereturn Falsedef verify(self, data, signature):if "sign_type" in data:data.pop("sign_type")unsigned_items = self.ordered_data(data)message = "&".join(u"{}={}".format(k, v) for k, v in unsigned_items)return self._verify(message, signature)实例化类def init_alipay():# 初始化Alipayalipay = AliPay(appid="appid",app_notify_url="回调地址",return_url="回调地址",app_private_key_path="私钥相对路径",alipay_public_key_path="公钥相对路径",debug=True # ⽀付环境)return alipayAPIasync def get(self):alipay = init_alipay()# 传⼀个标题订单号订单价格params = alipay.direct_pay("三⽅⼴告平台", order_no, money)url = f"https:///gateway.do?{params}"return self.write(ret_json(url))# 构建⼀个回调地址,⽤于⽀付成功后回调,在回调地址中可以获取订单号(out_trade_no)、⾦额(total_amount)、时间戳(timestamp),然后进⾏处理业务逻辑。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

B2B对接支付宝接口转接支付宝解决方案大型网上购物系统除了能让会员选择货到付款结账方式外,还应该提供一些更方便快捷的网上支付方式。

如果网上商店没有足够的实力提供会员直接在中建立现金账户的功能,就可以将订单信息转接到支付宝,让会员从支付宝付款。

当然就算会员可以在上建立自己的现金账户,提供支付宝支付功能也不失为另一种方便快捷的支付方式,这可以给客户提供更多可选的支付方式。

首先,网上购物系统必须与支付宝公司签订合作协议,以确保从本购物上传到支付宝上的订单信息能被正确接收。

当会员于购物上买下一系列商品并选择支付宝付款方式后,购物系统即将会员购物的订单信息转发到支付宝,页面也会转到支付宝的付款页面。

此时,支付宝页面会发送一个验证信息到本以确认支付宝正确收到订单信息。

会员于支付宝付款完成后,页面会重新跳回本购物,同时支付宝会将已付款的订单信息发回本以便对本购物的数据库进行必要的修改操作。

另外本还需要向支付宝发送一个返回信息,告知支付宝本系统已正确收到付款完毕的订单信息并且已经完成对数据的处理操作。

向支付宝传送订单信息时主要参数的含义:gateway :支付接口service:识别是何接口实现何功能的表示seller_email:商家签约时的支付宝账号,即收款的支付宝账号key:安全校验码,与partner是一组partner:商户ID,合作伙伴IDsign_type:加密类型_input_charset:编码类型show_url:展示地址,即在支付宝页面时商品名称旁边的“详情”的地址out_trade_no:会员订单编号,订单编号必须在本系统中保持唯一subject:商品名称,也可称为订单名称,该接口并不是单一的只能买一样东西,可把一次支付当作一次下订单body:商品描述,即备注total_fee:商品价格,也可称为订单的总金额源码分析(C#):首先必须建立一个通知页面(Notify.aspx)和一个返回页面(Return.aspx)以接受并验证从支付宝返回的信息并对数据库中相应的订单信息做修改处理操作。

Notify.aspx.cs代码using System;using System.Data;using System.Configuration;using System.Collections;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Text;using System.Collections.Specialized;using System.IO;using Gateway;///<summary>///创建该页面文件时,请留心该页面文件中无任何HTML代码及空格。

///该页面称作“通知页”,是异步被支付宝服务器所调用。

///当支付宝的订单状态改变时,支付宝服务器则会自动调用此页面,因此请做好自身订单信息与支付宝上的订单的同步工作///</summary>public partial class Alipay_Notify : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){string alipayNotifyURL ="https://.alipay./cooperate/gateway.do?service=notify_verify";//string alipayNotifyURL ="notify.alipay./trade/notify_query.do?";//此路径是在上面地址无法起作用时替换使用。

string partner = ""; //partner合作伙伴id(必须填写)string key = ""; //partner 的对应交易安全校验码(必须填写)string_input_charset = "utf-8";//编码类型,完全根据客户自身的项目的编码格式而定,千万不要填错。

否则极其容易造成MD5加密错误。

alipayNotifyURL = alipayNotifyURL + "&partner=" + partner + "&notify_id=" + Request.Form["notify_id"];//获取支付宝ATN返回结果,true是正确的订单信息,false 是无效的string responseTxt = AliPay.Get_Http(alipayNotifyURL, 120000);//*******加密签名程序开始*******int i;NameValueCollection coll;//Load Form variables into NameValueCollection variable.coll = Request.Form;// Get names of all forms into a string array.String[] requestarr = coll.AllKeys;//进行排序;string[] Sortedstr = AliPay.BubbleSort(requestarr);//构造待md5摘要字符串;StringBuilder prestr = new StringBuilder();for (i = 0; i < Sortedstr.Length; i++){if (Request.Form[Sortedstr[i]] != "" && Sortedstr[i] != "sign" && Sortedstr[i] != "sign_type"){if (i == Sortedstr.Length - 1){prestr.Append(Sortedstr[i] + "=" +Request.Form[Sortedstr[i]]);}else{prestr.Append(Sortedstr[i] + "=" +Request.Form[Sortedstr[i]] + "&");}}}prestr.Append(key);string mysign = AliPay.GetMD5(prestr.ToString(), _input_charset);//*******加密签名程序结束*******string sign = Request.Form["sign"];if (mysign == sign && responseTxt == "true") //验证支付发过来的消息,签名是否正确,只要成功进如这个判断里,则表示该页面已被支付宝服务器成功调用//但判断出现自身编写的程序相关错误导致通知给支付宝并不是发送success的消息或没有更新客户自身的数据库的情况,请自身程序编写好应对措施,否则查明原因时困难之极{if (Request.Form["trade_status"] == "WAIT_BUYER_PAY")// 判断支付状态_等待买家付款(文档中有枚举表可以参考){//更新自己数据库的订单语句,请自己填写一下string strOrderNO = Request.Form["out_trade_no"];//订单号string strPrice = Request.Form["total_fee"];//金额如果你申请了商家购物卷功能,在返回信息里面请不要做金额的判断,否则会校验通过不了。

}else if (Request.Form["trade_status"] == "TRADE_FINISHED" || Request.Form["trade_status"] == "TRADE_SUCCESS")// 判断支付状态_交易成功结束(文档中有枚举表可以参考){//更新自己数据库的订单语句,请自己填写一下string strOrderNO = Request.Form["out_trade_no"];//订单号string strPrice = Request.Form["total_fee"];//金额}else{//更新自己数据库的订单语句,请自己填写一下}Response.Write("success"); //返回给支付宝消息,成功,请不要改写这个success//success与fail及其他字符的区别在于,支付宝的服务器若遇到success时,则不再发送请求通知(即不再调用该页面,让该页面再次运行起来),//若不是success,则支付宝默认没有收到成功的信息,则会反复不停地调用该页面直到失效,有效调用时间是24小时以。

//最好写TXT文件,以记录下是否异步返回记录。

////写文本,纪录支付宝返回消息,比对md5计算结果(如不支持写txt文件,可改成写数据库)//string TOEXCELLR = "MD5结果:mysign=" + mysign + ",sign=" + sign + ",responseTxt=" + responseTxt;//StreamWriter fs = newStreamWriter(Server.MapPath("Notify_DATA/" +DateTime.Now.ToString().Replace(":", "")) + ".txt", false,System.Text.Encoding.Default);//fs.Write(TOEXCELLR);//fs.Close();}else{Response.Write("fail");//最好写TXT文件,以记录下是否异步返回记录。

相关文档
最新文档