微信支付流程

流程:

上图的网址为:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_4

如上图所示,微信网页支付的具体流程大致分为三个部分,最重要的是第一和第二部分:

  1. 第一部分:用户进入网页

    • 用户点击消息、链接或者扫描二维码,进入商品界面(即触发网页的window.onload事件的时候)。
    • 网页产生支付请求至商户服务器,支付服务器先产生商户订单,然后调用 统一下单API,向微信服务器发送请求。
    • 商户服务器接收到微信服务器对统一下单API的响应后,提取出参数prepay_id,并根据算法(后面会提到)生成支付签名,然后将prepay_id和支付签名作为上一步支付请求的响应数据返回给客户端,客户端 缓存此数据
  2. 第二部分:用户发起请求,服务器响应
    • 用户在商品界面中点击支付按钮后,根据第一部分取到的数据和商品数据调用jsapi接口(至微信服务器)请求支付,微信支付服务器对请求进行验证并响应,这个过程中,微信客户端显示“微信支付”的动画。
    • 如果上一步的请求验证通过,此时微信客户端会弹出密码输入对话框,让用户输入密码。
    • 用户输入密码点击支付后,微信客户端提交支付授权。
    • 微信客户端对支付授权进行验证,并将结果 同时发送 至用户客户端和商户服务器。其中微信服务器发送至商户服务器的通知url在第一部分的统一下单接口中由商户指定。
    • 商户服务器对上一步收到的结果进行处理,并响应。客户端也会收到微信支付结果的模板消息。

注意: 第二部分和商户的服务器没有任何交互。

  1. 第三部分

    • 微信跳转回商户的H5页面。
    • 商户网页调用请求查询订单结果。

具体的实现方案

上面的介绍详细解释了微信支付的流程,那么根据此流程,我们就可以分别对微信网页支付设计前端和后端的实现方案。

我们可以看到,上面的支付流程中有一点不是很合理的地方:就是每进入一次网页就请求一次支付接口,产生一个订单。因为很多时候,用户打开网页并不会点击购买产生实质的支付请求。这样会无故消耗不少服务器资源,特别是对于高并发网站来说。

对此我的改进方案是:在用户点击相关的产生实质支付的按钮时,才向商户后台发送支付,再调统一下单接口,返回prepy_id和签名,然后利用这个数据进行上面的第二部分,请求微信支付。这样做的好处是可以减少无效请求,但是坏处是两次请求的时间可能会较长,特别是第一个向商户后台下订单的请求,因为这个还需要调微信支付的服务,可能整个请求的响应会超过1s,慢的甚至2~3s,这会严重影响用户体验。而且此时,一般需要在前端显示一个“正在请求支付”的加载动画,不然几秒没响应用户会以为没效果再点击造成重复下单。

我们按照上面描述的改进方案进行前端和后端支付业务流程的设计。

微信网页支付前端流程

在第一节的图中忽略了一点,使用微信JSAPI支付的网页,必须在支付前使用微信JSAPI的config接口注入权限验证配置,这一步一般放在网页加载后,即window.onload()函数中来执行。具体内容参考:微信网页开发说明

前端的流程如下:

  1. 在页面中引入JS文件,网址为: http://res.wx.qq.com/open/js/jweixin-1.0.0.js

    ,在需要支付的页面中根据上面提到的注入权限验证配置(在页面的window.onload()函数编写wx.config()函数),权限配置验证中需要向商户服务器请求签名,后面会提到。
  2. 编写支付按钮的点击事件逻辑,函数中包括:
    • 向商户后台发送下单请求,返回的数据包括统一下单请求结果,(如成功),还有prepay_id和生成的支付签名。签名算法说明
    • 如果上一步成功,调用WeixinJSBridge.invoke函数调起支付,并编写支付成功和失败的回调函数。

微信网页支付后端流程

微信支付主要的逻辑在后端,后端的逻辑如下:

  1. 用户进入网页时,前端发送权限注入需要的签名请求,进行签名,并返回签名数据。签名算法 的附录一部分,涉及到请求的access_token是:网页授权access_token
  2. 用户点击支付,产生支付请求:
    • 获取支付金额等信息,先调用相关逻辑产生商户的订单,再按照统一下单API规定生成所需的数据,发送统一下单请求,获得响应。
    • 处理上一步的响应,如果成功,根据说明链接产生签名字符串,响应上一步的请求。

      为了前端处理方便,这一步可以将支付请求所需的所有参数都生成然后返回。

  3. 响应微信服务器发送支付结果:

    对第二步统一下单API中指定的notify_url添加支付结果处理逻辑,根据支付结果通知所述,返回指定信息,此接口要有处理重复通知的能力,具体详见前面的链接

其他

下面几篇文章将展示实现微信网页支付逻辑的前端和后端(基于java web框架spring mvc)的示例代码。

如有错误和疑惑之处请在评论区指出,谢谢。

微信支付之JSAPI开发-第二篇:业务流程详解与方案设计的更多相关文章

  1. 微信支付之JSAPI开发第一篇-基本概念

    申请权限 具体步骤就不说了,进入微信支付商户平台进行申请认证,认证成功后在微信公众号后台会有个微信支付的菜单按钮,点击后会有如下的信息 配置 在进行微信支付开发之前,必须进行一些必要的配置,如果这些配 ...

  2. 学会Git玩转GitHub(第二篇) 入门详解 - 精简归纳

    学会Git玩转GitHub(第二篇) 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 10 / 25 转载请注明出处!️ 目录 学会Git玩转GitHub(第二篇) 入门详解 - 精简归纳 ...

  3. iOS开发——UI篇&ScrollView详解

    创建方式 1:StoryBoard/Xib 这里StoarBoard就不多说,直接拖就可以,说太多没意思,如果连这个都不会我只能先给你跪了! 2:代码: CGRect bounds = [ [ UIS ...

  4. 微信支付开发-Senparc.Weixin.MP详解

    年底了,反而工作更忙了,我从15年11月开始写<1024伐木累>系列小说和爆笑对白,得到了很多身边的技术好友的支持,现在爆笑对白已经有越来越多的朋友一起帮着写段子,整理,包括小说内容的编辑 ...

  5. iOS开发——高级技术精选&底层开发之越狱开发第二篇

    底层开发之越狱开发第二篇 今天项目中要用到检查iPhone是否越狱的方法. Umeng统计的Mobclick.h里面已经包含了越狱检测的代码,可以直接使用 /*方法名: * isJailbroken ...

  6. IE8"开发人员工具"使用详解下(浏览器模式、文本模式、JavaScript调试、探查器)

    来源: http://www.cnblogs.com/JustinYoung/archive/2009/04/03/kaifarenyuangongju2.html 在上一篇文章IE8“开发人员工具” ...

  7. IE8“开发人员工具”使用详解上(各级菜单详解)

    来源: http://www.cnblogs.com/JustinYoung/archive/2009/03/24/kaifarenyuangongju.html IE8“开发人员工具”使用详解上(各 ...

  8. iOS 开发之照片框架详解之二 —— PhotoKit 详解(下)

    本文链接:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-three.html 这里接着前文<iOS ...

  9. iOS 开发之照片框架详解

    转载自:http://kayosite.com/ios-development-and-detail-of-photo-framework.html 一. 概要 在 iOS 设备中,照片和视频是相当重 ...

随机推荐

  1. JKS TO PEM

    tomcat 的ssl 会使用到jks,而haproxy的ssl(非tcp代理方式)会使用到pem 如果从tomcat的ssl需要迁移到haproxy的ssl,就需要从jks中读取相关信息生成pem文 ...

  2. 如何在 Delphi 中静态链接 SQLite

    搞了我几个小时,终于成功在 Delphi 中静态链接了 SQLite (v3.5.4),下一步就是研究加密了,呵呵中间其实遇到很多问题,今天累了,就不说了,改天补上 下载测试工程 下面说说方法 1.当 ...

  3. 为了体验 ILS 在Win2012R2 Hyper-V上安装Windows 2000 AdvSer

    Win2012 R2 Hyper-V 的集成服务包已不支持Windows 2000 先安装SP4.IE6.更新汇总包,再来安装这个. 安装完成后,会有几个未知设备,直接禁用就可以了. 开启Window ...

  4. 图片Exif 信息中Orientation的理解和对此的处理

    这个问题是在用七牛上传图片后获取宽高时发现的,一张图片,用图片浏览器打开始终是竖图,但是查看属性或者用七牛获取宽高,却发现宽大于高,也就是在属性中这是个横图.这样导致客户端用该宽高来展示图片会出现问题 ...

  5. mysql处理高并发,防止库存超卖

    先来就库存超卖的问题作描述:一般电子商务网站都会遇到如团购.秒杀.特价之类的活动,而这样的活动有一个共同的特点就是访问量激增.上千甚至上万人抢购一个商品.然而,作为活动商品,库存肯定是很有限的,如何控 ...

  6. Android EditText输入格式设置

    在开发的过程中,通常会用到EditText,如何让虚拟键盘来适应输入框中内容的类型,通常我们都会在xml文件中加入android:inputType="". android:inp ...

  7. [C#常用代码]类库中读取解决方案web.Config字符串

    对于类库里读取解决方案web.config文件里字符串的方法一.读取键值对的方法:1.添加引用using System.Configuration;2.web.Config配置节<appSett ...

  8. NSTimer的使用[zhuang]

    NSTimer 的头文件 /* NSTimer.h Copyright (c) 1994-2015, Apple Inc. All rights reserved. */ #import <Fo ...

  9. shell 命令集

    shell 常用知识点--------------------------------------- sed 用法 http://www.cnblogs.com/edwardlost/archive/ ...

  10. C# 多线程线程池( 一 )

    我们将在这里进一步讨论一些.NET类,以及他们在多线程编程中扮演的角色和怎么编程.它们是: System.Threading.ThreadPool 类 System.Threading.Timer 类 ...