商户网站使用第三方支付的大致原理和实现

如果把商户网站使用第三方支付平台(比如支付宝)的原理搞清楚,那编程就变得简单多了。


整个过程大致这样:

 

1、商户与支付宝签约。
2、在商户网站购买商品,填写数量,确定购买后跳转到结账页面。结账页面可能包括订单号、定单状态(已支付/未支付)、收货人信息、配送方式、定单金额、配送费用、总金额、支付方式、结账按钮,等等。
3、当点击"结账"按钮,会重定向到支付宝付款页面。而在后台,实际上是把数据提交到支付宝一个接收支付信息的网关,比如是http://www.zhifubao.com:6060/AliPay/PayGate.ashx,然后再重定向到支付宝付款页面。
4、付款成功后,重定向到商户用来显示支付成功的一个页面,该页面可以显示定单编号、总金额等信息。


其中有几个关键之处:

 

1、明确支付宝支付网关所需要的url格式

 

比如类似"http://www.zhifubao.com:6060/AliPay/PayGate.ashx?partner=18&return_url=http%....%"这样的格式,那么,编程的时候应该严格按照这种格式来拼接字符串。

 

2、明确在支付宝支付成功后重定向到商户支付成功页的url中,支付宝给我们反馈的url参数

 

支付宝反馈的格式类似"http://localhost:1746/Shop/PayCallBack.aspx?out_trade_no=222&returncode=ok&total_fee=400&sign=ddddddd+md5值"这样,我们可以使用Request[key],取出对应的部分,比如定单编号,定单金额,等等。

 

3、在向支付宝网关提交数据的时候,支付宝要求其中一个参数sign必须是MD5值

 

这个MD5值是把商户编号、支付成功显示页面、商户密匙等信息按照固定的顺序进行MD5加密获得。商户密匙一般都可以在支付宝后台设置。

 

4、在支付宝支付成功后重定向到商户支付成功页的url中,有一个sign参数也包含了MD5值

 

这个MD5值是把定单编号、返回地址、总金额、商户密匙等信息按照固定的顺序进行MD5加密获得,编码的时候,我们需要重新根据定单编号、返回地址、总金额、商户密匙等信息按照固定的顺序进行MD5加密获得一个值,两个值比较,如果相等,就说明没有篡改,支付成功。

 

5、明确支付宝支付网关地址

 

这个地址用来接收来自商户的信息,类似这样:http://www.zhifubao.com:6060/AliPay/PayGate.ashx?partner=18&return_url=http%....%


支付宝接口提供的信息大致如下:

 

支付网关地址:

 

http://www.zhifubao.com:6060/AliPay/PayGate.ashx

 

支付网关参数:

 

Partner:商户编号
return_url:支付成功地址
subject:商品名称
body:商品描述
out_trade_no:订单号,由商户网站生成
total_fee:总金额
seller_email:卖家邮箱
sign:数字签名,总金额、商户编号、订单号、商品名称、商户密匙顺序连接获得的MD5值

 

回调商户地址:

 

out_trade_no:订单号
returncode:返回码,ok或error
total_fee:支付金额
sign:数字签名,订单号、返回码、支付金额、商户密匙顺序连接获得的MD5值

 

搞清了原理,编码变得简单。

 

当点击支付:

 

string md5Str = SomeCommonHelper.GetMD5("总金额","商户编号","订单号","商品名称","商户密匙");
string url = "http://www.zhifubao.com:6060/AliPay/PayGate.ashx?partner=商户编号&return_url=" + Server.UrlEncode("http://...商户支付成功显示页面") + "&subject=" + Server.UrlEncode(商品名称) + "&body=" + 商品描述 + "&out_rade_no=" + 商品编号 + "&total_fee=" + 总金额 + "&seller_email=" + 商户邮箱 + "&sign=" + md5Str;
Response.Redirect(url);
 

 

支付成功显示页面:

 

string out_trade_no = Request["out_trade_no"];
string returncode = Request["returncode"];
string total_fee = Request["total_fee"];
string sign = Request["sign"];
//自己算MD5值
string myMD5 = SomeCommonHelper.GetMD5(out_trade_no + returncode + total_fee + "商户密匙");
if(sign != myMD5){
    Response.Write("支付失败");
} else{
    Response.Write("支付成功");
}
 

 

就这样。

转载于:https://www.cnblogs.com/darrenji/p/4390455.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/247155.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Awesome Deep Vision

本文转自:https://github.com/kjw0612/awesome-deep-vision http://jiwonkim.org/awesome-deep-vision/ A curated list of deep learning resources for computer vision, inspired by awesome-php and awesome-computer-vision. Maintainers - Jiwon Kim, Heesoo …

GitHub 新出的 Actions 是什么? 用他做自动测试?

体验分享 本文一个尝鲜的体验分享, 并没有太复杂的技巧, 做了一个最少代码的例子展示, 让每个人都可以把action用起来, 如果路过的大牛有高级技巧请留言分享, 我会补充. 下面正文开始. 是什么? 是一个免费的操作系统容器(Linux/Windows/macOS), 我们可以让他预装开发环境(node…

caffe框架翻译-理解(转载)

本文转自: http://dirlt.com/caffe.html http://blog.csdn.net/songyu0120/article/details/468170851 caffe http://caffe.berkeleyvision.org/ 1.1 setup 安装需要下面这些组件。这些组件都可以通过apt-get获得。 libgoogle-glog-dev # gloglibgflags-dev # gfla…

贾扬清分享_深度学习框架caffe

本文转自: http://www.datakit.cn/blog/2015/06/12/online_meet_up_with_yangqing_jia.html http://www.ifight.me/187/ Caffe是一个清晰而高效的深度学习框架,其作者是博士毕业于UC Berkeley的 贾扬清,目前在Google工作。本文是根据机器学习…

iOS多线程理解

在iOS开发中,线程的创建与管理已经被Apple进行了很好的封装,但是在开发者实际开发中会滥用GCD,导致整个代码混乱不堪,因此在这里需要对iOS开发中的多线程开发进行整理。 1. 主线程完成耗时操作,会导致UI卡顿,因此耗时…

Java生鲜电商平台-SpringCloud微服务架构中分布式事务解决方案

Java生鲜电商平台-SpringCloud微服务架构中分布式事务解决方案 说明:Java生鲜电商平台中由于采用了微服务架构进行业务的处理,买家,卖家,配送,销售,供应商等进行服务化,但是不可避免存在分布式事…

批量提取 caffe 特征 (python, C++, Matlab)(待续)

本文参考如下: Instant Recognition with Caffe Extracting Features Caffe Python特征提取 caffe 练习4 —-利用python批量抽取caffe计算得到的特征——by 香蕉麦乐迪 caffe 练习3 用caffe提供的C函数批量抽取图像特征——by 香蕉麦乐迪 caffe python批量抽…

iOS单例初步理解

iOS单例初步理解 在iOS开发中,系统自带的框架中使用了很多单例,非常方便用户(开发者,使用比如[NSApplication sharedApplication] 等),在实际的开发中,有时候也需要设计单例对象,为…

python面向对象之类的成员

面向对象之类的成员 细分类的组成成员 类大致分为两块区域: 第一部分:静态字段 第二部分:动态方法 class Animal:type_name "动物类" # 静态变量(静态字段)__feature "活的" # 私有静态变量…

python元类、反射及双线方法

元类、反射及双线方法 元类 print(type(abc)) print(type(True)) print(type(100)) print(type([1, 2, 3])) print(type({name: 太白金星})) print(type((1,2,3))) print(type(object))class A:passprint(isinstance(object,type)) print(isinstance(A, type)) type元类是获取该…

iOS中的多线程一般使用场景

在IOS开发中为提高程序的运行效率会将比较耗时的操作放在子线程中执行,iOS系统进程默认启动一个主线程,用来响应用户的手势操作以及UI刷新,因此主线程又叫做UI线程。 前面的Blog说明了NSThread以及GCD处理并发线程以及线程安全(线…

iOS中如何优化Cell中图片的下载性能

在iOS开发中使用最为常见的是UITableView,其中UITabelViewCell中下载图片,会影响用户下拉刷新UI,导致卡顿,用户体验不好,在这篇blog中,我将以一个例子来说明如何优化UITableView下载图片 1.使用懒加载方式&#xff0c…

【Yoshua Bengio 亲自解答】机器学习 81 个问题及答案(最全收录)

本文转自:http://mp.weixin.qq.com/s?__bizMzI3MTA0MTk1MA&mid401958262&idx1&sn707f228cf5779a31f0933af903516ba6&scene1&srcid0121zzdeFPtgoRoEviZ3LZDG#rd 译者:张巨岩 王婉婷 李宏菲 戴秋池 这是 Quora 的最新节目&#xf…

Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析

Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析 说明:Java生鲜电商平台中,由于服务进行了拆分,很多的业务服务导致了请求的网络延迟与性能消耗,对应的这些问题,我们应该如何进行网络请求的优化与…

XCode7 创建framework

1.新建一个静态库工程. file→ new→ project, 弹出框中选择iOS→ framework & library中的cocoa touch static library.点击Next,输入product name: TestFramework, 点击Next→ 点击Create. 2.删除向导所生成工程中的Target. 点击工程名→ 点击TARGETS → 右键Delete. …

基础js逆向练习-登录密码破解(js逆向)

练习平台:逆向账号密码 https://login1.scrape.center/ 直接打开平台,输入密码账号,抓包找到加密的参数携带的位置,这边我们找到的是一个叫token的加密参数,这个参数的携带是一个密文 我们首先考虑一下搜索这个加密的…

python之socket

socket套接字 什么叫socket socket是处于应用层与传输层之间的抽象层,他是一组操作起来非常简单的接口(接受数据)此接口接受数据之后,交由操作系统.socket在python中就是一个模块. socket两个分类 基于文件类型的套接字家族 套接字家族的名字:AF_UNIX unix一切皆文件…

iOS----JSON解析

在iOS开发中与服务器进行数据交互操作,操作过程中使用最为常见的格式为JSON与XML,其中JSON较为清量,因此本篇blog就讲解一下如何在iOS中进行JSON解析。 1.建立HTTP请求 (1)创建URL NSString *URLStr [NSString stringWithFormat:”http:/…

VS中每次改代码后运行程序不更新,只有重新编译才生效。

解决方法:将项目移除解决方案,再重新添加进来,即添加->现有项目->选择.vcxproj文件,即可解决。 转载于:https://www.cnblogs.com/Gregg/p/11358711.html