B2C电商的支付,一般由于支付金额比较小,支付比较频繁,所以一般采用第三方支付,常用的第三方支付有:支付宝、微信、易宝支付等。他们的原理都差不多。都是在点击支付时,直接调用第三方支付接口,传入appid、appsecret、订单编号、订单金额、回调url,直接跳转到第三方支付页面,接下来的支付过程,我们都不需要管,支付成功以后,第三方支付平台会直接回调我们的url。给我们返回:状态码、订单编号、支付流水号三个参数。我们首先根据订单编号,找到我们的订单,把支付流水号和状态码更新到我们的订单里边。回调url,一般有两种,一种用同步get方法回调,一种用异步的类似ajax方法回调,同步方法回调,一般是成功以后才会回调,并且只回调一次,回调成功以后我们可以直接跳转到我们的支付成功页面、异步方法回调,一般要求我们返回一个success字符串,第三方平台如果没有接受到success,就会认为没有调用成功,他会重复多次调用。比如支付宝会在25小时之内,调用8次;一般情况下第三方支付都采用第二种方式,因为比较安全,但支付宝是同时采用了两种。
我之前接触过一个B2B的电商,他们由于交易金额比较大,第三方支付无法实现,所以是直接和银行对接。大体上是,首先平台和银行签订合同,银行为平台开设一个总账号,当企业在平台注册以后,平台会为企业调用银行接口,创建一个子账号,这个子张号是挂在总账号下边的,也是一个在银行实际存在的账号,但是,只能通过外部银行卡给里边转账,而不能给外部银行卡转出。可以在子行号直接互相转账。
微信扫描支付
1、商户系统根据用户选择的商品生成订单(此步骤不分析)
2、用户确认支付后根据微信【统一下单API】,向微信支付系统发出请求(我们通过httpclient方式请求的)
分析:商户确认支付即点击“结算”按钮跳转到收银台,然后在点击微信支付时,会调用商户系统后台,后台做处理准备微信需要的参数,然后通过httpclient调用微信的【统一下单API:https://api.mch.weixin.qq.com/pay/unifiedorder】,其中需要准备的主要参数:
appid(公众号ID),String(32),微信支付分配的公众号ID
商户号(mch_id),String(32),微信支付分配的商户号
随机字符串(nonce_str),String(32),随机字符串,主要是为了保证签名不可预测
签名(sign),String(32),通过签名算法得到的签名值,签名算法大致为:需要参与的字段包含公众号、商户号、随机字符串、一些其他字段,最重要是key(在微信支付系统中配置的密钥),然后这些字段格式为:key1=value1&key2=value2…,然后把这个字符串通过MD5加密并把加密结果转成大写。
商户订单号(out_trade_no),String(32),商户系统内部订单号,我们系统用的是交易流水号(订单号-商户号-时间戳)
标价金额(total_fee),int,订单总金额,单位为分,不能带小数点
通知地址(notify_url),String(256),异步接收微信支付结果通知的回调地址,必须为外网能访问的URL,不能带参数
交易类型(trade_type),String(16),JSAPI–公众号支付、NATIVE–原生扫码支付、APP–app支付,我们用的是NATIVE
3、微信支付系统收到请求后,先生成预支付订单,然后给商户系统返回二维码连接
4、商户系统拿到返回值字符串,转换成对象,然后取出二维码连接生成二维码
5、用户通过微信“扫一扫”功能扫描二维码,微信客户端将扫码内容发送到微信支付系统
6、微信支付系统接收到支付请求,验证链接有效性后发起支付,请求客户确认,然后我们的微 信端就会弹出需要确认支付的页面
7、用户输入密码,确认支付并提交授权
8、微信支付系统根据用户授权完成交易
9、微信支付系统支付成功后向微信客户端返回交易结果,并将交易结果通过短信、微信提示用户
10、微信支付系统通过发送异步消息通知商户系统后台支付结果,商户系统需回复接收情况,通 知微信支付系统不再发送该单的通知
接收到微信的支付完成回调请求,微信支付系统会传过来一个字符串,格式是xlm的我们将其转换成map格式,然后验证一些主要参数,return_code和result_code均 为success;公众号,商户id不为空;对签名进行验证,防止数据泄漏,验证方法是将返回集解析出来,然后重新按照签名规则生成签名,将两个新旧签名比较,如果相同则验证通过;以上验证全部通过则认为威信支付系统支付成功,接下来处理商户系统。
商户系统也需要验证一些支付异常情况,订单已取消的支付成功了;订单已经支付了,重复支付;订单金额不一致,支付金额与订单金额不一致;以上均为异常支付,需要退款。如果无异常支付,则更新本地数据。另外商户系统在进行上述验证及更新操作时,需将此段代码加锁,因为微信支付系统在与商户系统交互时,如果微信收到的用户应答不是成功或超时,则认为微信通知失败,则微信会重新发起通知,通知频率为:通知频率为:15/15/30/180/1800/1800/1800/1800/3600,单位:秒
11、未收到支付通知的情况,商户系统可调用【查询订单APP】
12、商户确认订单已经支付后给用户发货
支付宝支付:
一、流程:
1、用户请求支付,调用我方接口,我方根据订单信息和商品信息构造符合支付宝要求的请求参数(请求参数中具有一个我方的回调地址,当支付成功的时候,支付宝会回调这个接口)去请求一个支付二维码(可设置支付二维码的过期时间)。我方将支付二维码持久化到图片服务器,然后图片地址给前端,让前端展示给用户。
2、剩下这一步就是用户和支付宝的交互了。用户支付成功后,支付宝回调我们的接口,我们的接口开始去更新订单状态,写支付信息到我们的数据库中,如此一个完整的支付场景就完成了。支付宝会根据我们返回的值,判断这次交易是否成功,不成功则不扣钱。
二、难点
1、如何确保是支付宝回调的我们的接口?
如果是被恶意的第三方调用我们的接口,并且通过了将订单状态更新了,那么就相当于我们形成了损失。
支付宝自身提供了一套校验机制(这套校验机制是怎么做的,值得学习),我们可以通过调用支付宝的校验接口去校验回调是否来自支付宝。
2、如何保证幂等性?
如果是因为网络原因、用户多次点击。那么要保证这些操作造成的结果是一致的。
我的处理方案:先去数据库中查询状态,如果状态是订单已支付,那么返回支付已完成的消息,否则去更新订单信息。
缺点:如果正在更新状态,一个请求又过来了,那么还是不能保证幂等性。
改进:使用一个全局分布式锁,每次要进行这个操作(其中还是有查询状态这个操作),去持有这个分布式锁,执行成功之后去释放这个分布式锁(这是为了避免高并发带来的问题)。

第三方支付,微信支付及支付宝的一些入门了解相关推荐

  1. 若依分离版整合IJpay实现第三方支付-(微信支付篇_v2)

    若依分离版整合IJpay实现第三方支付-(微信支付篇_v2) IJpay官网 https://javen205.gitee.io/ijpay/ 文章目录 若依分离版整合IJpay实现第三方支付-(微信 ...

  2. android支付宝支付微信支付封装,如何在Android App中集成支付宝和微信支付功能

    前言 本文主要介绍如何在 Android App 里集成支付宝和微信支付的功能,文中将实现的步骤一步步介绍的非常详细,对同样遇到这个问题的朋友相信会是一个很好的参考,下面话不多说了,来一起看看详细的介 ...

  3. iOS开发之第三方支付微信支付教程,史上最新最全第三方微信支付方式实现、微信集成教程,微信实现流程

    本章项目demo: https://github.com/zhonggaorong/weixinLoginDemo 本章不讲解: 微信sdk的集成 , 项目集成的文章请参照 (包含微信登录):   h ...

  4. 微信企业支付 服务器根证书,微信第三方平台微信支付配置没有rootca.pem根证书文件的解决办法-蜘蛛网博客...

    微信第三方平台微信支付配置没有rootca.pem根证书文件的解决办法我们在通过微信第三方平台制作微信活动的时候,很多情况下都需要用到微信支付接口,例如商城类的微信功能,微砍价.微助力.微秒杀.微拼团 ...

  5. Android如何调用支付宝支付 微信支付

    1.支付宝支付-------------------------- 1,到支付宝官网,下载支付宝集成开发包,看懂里面的关键代码 由于android设备一般用的都是无线支付,所有我们申请的就是支付宝无线 ...

  6. android移动支付——微信支付

    前言 这里开篇讲解一系列的Android相关的移动支付.移动支付也称为手机支付,用户使用移动的设备,完成对所购买商品或者服务的支付功能.包括远程支付(网上支付.短信支付),近场支付(刷卡.滴卡.pos ...

  7. android移动支付——微信支付,flutter瀑布流内存

    我们这里主要是来学习一下支付宝,微信支付,银联支付和paypal支付 现实生活中的支付就是:去商店浏览商品->把商品加入购物车->把购物车中的商品拿到收银台付款 上面的支付流程细化下来就是 ...

  8. android移动支付——微信支付,360°深入了解Flutter

    国内的移动支付方式: 支付宝,微信,银联,百度钱包,QQ钱包,财付通,京东支付 易宝支付,快钱支付,还有一些第三方的支付什么连连支付之类的 境外的移动支付方式(这里直说一个) :paypal 流程 我 ...

  9. php如何在微信跳转支付宝支付,微信支付成功了怎么跳转到我指定的信息提示页? - 码支付...

    ...进行安装,安装说明如下.图文教程:https://codepay.fateqq.com/help/BkyNe9_tl.html下面是一个如何上传使用API接口的简单例子 .1:上传codepay ...

  10. PC端支付——微信支付与支付宝支付

    1.微信支付 在pc端的微信支付功能中,调取微信统一下单接口后端返回的是一个支付链接,需将这个链接转化为二维码,扫码支付, PC端的扫码页面需要自己编写,统一下单之后,需要设置定时器查询订单状态,当订 ...

最新文章

  1. 大数据教程(13.6)sqoop使用教程
  2. python3.8自带matlop和numpy吗_Python enlop包_程序模块 - PyPI - Python中文网
  3. python400集视频教程 百度云-Python自动化测试视频教程【百度云盘下载】
  4. 5-Error:failed to find Build Tools revision 28.0.0 rc1解决方案
  5. 《JavaScript语言精髓与编程实践》读书笔记二
  6. JEPLUS表格组件数据平铺——JEPLUS软件快速开发平台
  7. 多久没有给家里打过电话了?
  8. c语言interrupt函数,中断处理函数数组interrupt[]初始化
  9. mysql config.path_mysql之 mysql_config_editor/login-path 登录密码保护
  10. Hive:用Java代码通过JDBC连接Hiveserver
  11. Axure导入元件库和使用
  12. 线性表的链式存储结构——链表及其操作(创建,查找,插入,输出,删除)
  13. vscode百度网盘下载
  14. 日本互联网的十大知名巨头!你听说过几个?
  15. 6、Hello World官网教程(TX2)第一部分
  16. mysql基础文档_mysql基础
  17. android otg读写文件,Android USB Host在USB设备OTG中读/写文件
  18. 初中使用计算机教学反思,初中信息技术教学反思与体会
  19. Echarts(三):含有时间轴的可视化案例1
  20. FPGA图像处理12_常用算法_饱和度调节

热门文章

  1. 微信APP支付配置文档
  2. 01.FFmpeg下载以及安装
  3. Android测试点和测试工具介绍
  4. mysql触发器更新前触发_mysql触发器实例:更新前触发
  5. mysql同步 触发器_MySQL触发器运用于迁移和同步数据的实例教程
  6. 【大数据实验2】hadoop配置、测试和实例
  7. python网易云付费歌曲下载_python 根据网易云歌曲的ID 直接下载歌曲的实例
  8. CPDA数据分析师证书含金量高吗?
  9. python 定时任务 web管理_python定时任务
  10. 如何在30天内拿下软考初级程序员?