支付宝web支付
过程
1. 用户下单
2. 商户后台产生订单
3. 请求支付宝web支付页面(将订单信息返回给用户---放在form里面---隐藏起来-----并通过脚本自动提交此form到支付宝web支付页)
4. 用户在支付宝官方支付web页上进行支付,完成后,支付宝跳转(redirect)到form里面的参数return_url指定的地址。同时异步方式通知商户后台(form里面的参数notify_url指定接收通知的地址)
5. 在return_url指定的页面里显示支付结果(在notify_url指定的页面里面处理发货逻辑)
技术要点
1. 组装form返回给客户端,demo如下:
<html><head></head><body>
<form id='alipaysubmit' name='alipaysubmit' enctype='multipart/form-data'
action='https://mapi.alipay.com/gateway.do?_input_charset=utf-8' method='POST'>
<input type="hidden" name="seller_email" value="xxx@163.com"/>
<input type="hidden" name="_input_charset" value="utf-8"/>
<input type="hidden" name="sign" value="31e0dce2c291cfac59401019e3dfe4da"/>
<input type="hidden" name="notify_url" value="http://www.xxx.com/alipay_notify"/>
<input type="hidden" name="partner" value="20888xxxxxxxx302"/>
<input type="hidden" name="subject" value="test"/>
<input type="hidden" name="service" value="create_direct_pay_by_user"/>
<input type="hidden" name="out_trade_no" value="1470xxxx28068"/>
<input type="hidden" name="payment_type" value="1"/>
<input type="hidden" name="total_fee" value="0.01"/>
<input type="hidden" name="sign_type" value="MD5"/>
<input type="hidden" name="return_url" value="http://www.xxx.com/alipay_return"/> <input type="submit" value="submit" style="display:none"/>
</form></body>
<script>document.forms['alipaysubmit'].submit();</script></html>
</html>
注意,基本每个有name属性的input的name对应参数都是必填。
官方文档看这里:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.YRtzUV&treeId=58&articleId=103584&docType=1
2. 签名
md5.加密(排序拼接串+密钥)
所谓“排序拼接串”即为:将参数按照名称排序,然后拼接成a=1&b=2的形式(不要加入sign和sign_type参数),本例demo为:
_input_charset=utf-8¬ify_url=http://www.xxx.com/alipay_notify&out_trade_no=1470xxxx28068&partner=20888xxxxxxxx302&payment_type=1&return_url=http://www.xxx.com/alipay_return&seller_email=xxx@163.com&service=create_direct_pay_by_user&subject=test&total_fee=0.01
python版本实现
for过程步骤3
import md5
def get_alipay_web_html(order_number, goods_name, total_price):
"""
DEMO演示:返回自动提交支付宝的form的html代码
args in:
order_number, 商户订单号
goods_name, 货物名称(购买内容描述)
total_price, 总价
"""
url_root = request.url_root
web_alipay_data={
"service": "create_direct_pay_by_user",
"partner": "2088xxxxxxxx11302",
"_input_charset": "utf-8",
"payment_type": "",
"notify_url": '%s%s'%(url_root, 'alipay_notify') ,
"return_url": '%s%s'%(url_root, 'alipay_return') ,# url_for('alipay_return'),
"seller_email": "xxx@163.com",
"out_trade_no": order_number,
"subject": goods_name,
"total_fee": total_price,
"sign": "test",
"sign_type": "MD5"
}
t=""
for k,v in sorted(web_alipay_data.items(), key = lambda x:x[0]):
if k not in ('sign', 'sign_type'):
t+="%s=%s&"%(k,v)
t=t[:-1]
key = 'xxxx4mk9ms6rxxxxghlvyrd2sfdxxxx'
#print t+key
web_alipay_data.update({'sign':md5.new((t+key).encode('utf-8')).hexdigest()}) response_form_html ="""<html><head></head><body>
<form id='alipaysubmit' name='alipaysubmit' enctype='multipart/form-data'
action='https://mapi.alipay.com/gateway.do?_input_charset=utf-8' method='POST'>
%s
<input type="submit" value="submit" style="display:none"/>
</form></body>
<script>document.forms['alipaysubmit'].submit();</script></html>
</html>
"""
html_inputs=""
for k,v in web_alipay_data.items():
html_inputs +='<input type="hidden" name="%s" value="%s"/>\n'%(k,v)
return response_form_html%html_inputs
在用户提交订单(通常post方式)到服务器后, 生成订单,并将订单信息包裹到form里面(以上函数只包裹了订单号),返回form给客户端浏览器, 由于脚本
<script>document.forms['alipaysubmit'].submit();</script>
的存在,此form会自动提交给支付宝。
注意变更 partner参数(商户id)和 key参数(md5加密用密钥,不知道看这里),以及商家的邮箱(seller_email);
回调地址(notify_url)和返回地址(return_url)根据实际情况修改。
支付通知回调
支付宝会将支付结果异步的方式post/get给商户服务器。
在post方式中,有一个问题需要注意:
如果notifiy_url对应的url里面有参数(例如: notify_url?xxx_field=xxx_value), 支付宝会将此参数截取出来,放到post的body中,收到的body段会多一个( &xxx_field=xxx_value), 此字段不能参与签名验证! 否则签名不匹配!
即自定义的url参数,会在异步通知的body中post回来, 签名时要把他们排除出去!!!这一点官方文档没有说明。
后记
支付宝/微信支付麻烦的不是技术,而是各种配置,“平台”入口太多, 一不小心就掉坑里了。
转载请注明来自:http://www.cnblogs.com/Tommy-Yu/p/5739971.html,谢谢!
支付宝web支付的更多相关文章
- 集成支付宝钱包支付iOS SDK的方法与经验
流程 摘自第一个文档<支付宝钱包支付接口开发包2.0标准版.pdf> 图中的“商户客户端”就是我们的iOS客户端需要做的事情: 调用支付宝支付接口 处理支付宝返回的支付结果 在调用支付宝支 ...
- ios--集成支付宝钱包支付iOS SDK的方法与经验
文/胖花花(简书作者)原文链接:http://www.jianshu.com/p/fe56e122663e著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 没想到,支付宝的SDK是我目前 ...
- 集成支付宝钱包支付ios SDK的方法和经验
没想到,支付宝的SDK是我目前用过的所有第三方SDK中最难用的一个了. 下载 首先,你要想找到这个SDK,都得费点功夫.现在的SDK改名叫移动支付集成开发包了,下载页面在 这里 的 “请点此下载集成开 ...
- 集成支付宝钱包支付 iOS SDK 的方法与经验
下载 首先,你要想找到这个SDK,都得费点功夫.现在的SDK改名叫移动支付集成开发包了,下载页面在 这里 (http://t.cn/8ksiklD)的 “请点此下载集成开发包(http://t.cn/ ...
- ASP.NET Core Web 支付功能接入 支付宝-电脑网页支付篇
这篇文章将介绍ASP.NET Core中使用 开源项目 Payment,实现接入支付宝-电脑网页支付接口及同步跳转及异步通知功能. 开发环境:Win 10 x64.VS2017 15.6.4..NET ...
- 【转载】ASP.NET Core Web 支付功能接入 支付宝-电脑网页支付篇
转自:http://www.cnblogs.com/essenroc/p/8627775.html 这篇文章将介绍ASP.NET Core中使用 开源项目 Payment,实现接入支付宝-电脑网页支付 ...
- java 支付宝wap支付初识
最近突然想弄下支付宝的支付,因为感觉很好玩.中间遇到很多问题,查查找找,总算是整了两天给整出来了,这里为自己记录下. 第一步:直接去安卓支付宝的官方文档去,写的很清楚了已经,这里有源码https:// ...
- ASP.NET MVC Filters 4种默认过滤器的使用【附示例】 数据库常见死锁原因及处理 .NET源码中的链表 多线程下C#如何保证线程安全? .net实现支付宝在线支付 彻头彻尾理解单例模式与多线程 App.Config详解及读写操作 判断客户端是iOS还是Android,判断是不是在微信浏览器打开
ASP.NET MVC Filters 4种默认过滤器的使用[附示例] 过滤器(Filters)的出现使得我们可以在ASP.NET MVC程序里更好的控制浏览器请求过来的URL,不是每个请求都会响 ...
- .Net后台实现支付宝APP支付
前面讨论了微信支付,接下来聊聊支付宝的APP支付(新款支付宝支付).其实这些支付原理都一样,只不过具体到每个支付平台,所使用的支付配置参数不同,返回至支付端的下单参数也不同. 话不多说,直接上代码. ...
随机推荐
- SQL Server表分区
什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在 ...
- Java 征途:行者的地图
前段时间应因缘梳理了下自己的 Java 知识体系, 成文一篇望能帮到即将走进或正在 Java 世界跋涉的程序员们. 第一张,基础图 大约在 2003 年我开始知道 Java 的(当时还在用 Delph ...
- React使用antd Table生成层级多选组件
一.需求 用户对不同的应用需要有不同的权限,用户一般和角色关联在一起,新建角色的时候会选择该角色对应的应用,然后对应用分配权限.于是写了一种实现的方式.首先应用是一个二级树,一级表示的是应用分组,二级 ...
- ASP.NET Core应用针对静态文件请求的处理[2]: 条件请求与区间请求
通过调用ApplicationBuilder的扩展方法UseStaticFiles注册的StaticFileMiddleware中间件帮助我们处理针对文件的请求.对于StaticFileMiddlew ...
- 浅谈web攻防
CSRF 跨站请求伪造(Cross-Site Request Forgery) -原理- 从上图可以看出,要完成一次CSRF攻击,受害者必须依次完成两个步骤: 1.登录受信任网站A,并在本地生成Coo ...
- Xamarin+Prism开发详解二:Xaml文件如何简单绑定Resources资源文件内容
我们知道在UWP里面有Resources文件xxx.resx,在Android里面有String.Xml文件等.那跨平台如何统一这些类别不一的资源文件以及Xaml设计文件如何绑定这些资源?应用支持多国 ...
- 尝试asp.net mvc 基于controller action 方式权限控制方案可行性
微软在推出mvc框架不久,短短几年里,版本更新之快,真是大快人心,微软在这种优秀的框架上做了大量的精力投入,是值得赞同的,毕竟程序员驾驭在这种框架上,能够强力的精化代码,代码层次也更加优雅,扩展较为方 ...
- 让ASP.NET接受有“潜在危险”的提交
什么是有“潜在危险”的提交?马上动手写个简单的例子: 用Visual Studio创建一个空白的ASP.NET MVC程序,一切默认即可,添加一个空白的HomeController,增加一个Ind ...
- CSharpGL(21)用鼠标拾取、拖拽VBO图元内的点、线或本身
CSharpGL(21)用鼠标拾取.拖拽VBO图元内的点.线或本身 效果图 以最常见的三角形网格(用GL_TRIANGLES方式进行渲染)为例. 在拾取模式为GeometryType.Point时,你 ...
- 创建一个Phone实体,完成多页面的电话簿项目
添加实体 在类库CORE中添加: [Table("PbPhones")] public class Phone : CreationAuditedEntity<long> ...