西米支付:支付宝/微信支付/银联支付通道的接入介绍

2023-11-01

本文以电脑网站支付为例,着重对第三方支付通道的接入进行了分析,包括支付宝支付接入、微信支付接入及银联支付接入。

  1、支付宝支付接入

  支付宝支付能力主要有当面付、刷脸付、App支付、手机网站支付、电脑网站支付和花呗分期等,本文采用电脑网站支付实现聚合支付系统的支付宝支付功能。

  要在应用中开通电脑网站支付能力首先需要登录支付宝开放平台在开发者中心创建应用并且申请开通相关开放产品使用权限,为了保证交易双方的身份和数据安全,开发者在调用接口前需要配置双方密钥对交易数据进行双方校验。如下图1所示为支付宝开发接入流程简单示意图。

图1 支付宝支付开发接入流程

  支付宝开发平台支持RSA(SHAlWithRSA)和RSA2(SHA256WithRSA)两种签名算法,RSA2签名算法比RSA有更强的安全能力。签名的过程即生成签名方将传送的消息用私钥加密的过程,验签则是指验签方使用公钥对消息进行验证的过程。签名和验签的具体内容如下:

  生成签名方:首先对参数放入一个字符串数组signFields,将参数和值保存在一个对象或Map里,通过JSONObject将其变更为JSON对象,接着是签名原文的生成,在生成的过程中可以通过Java的Arrays.sort实现参数按照字典的次序进行排序,继而通过RSA的私钥对其实施签名。

  验签方:与签名构建方一样先生成签名原文,其次通过RSA的公钥生成签名方传入的签名,把签名原文对生成签名方传入的签名进行验证,验证结果为true则表示验证成功。

  应用创建、应用配置以及SDK集成并配置完成后就可以调用具体的接口了。

  如下图2所示为支付宝电脑网站支付的接口调用时序图。

图2 支付宝电脑网站支付接口调用时序图

  其中returnUrl表示同步回调即前台通知:第三方支付系统以浏览器重定向的形式将支付结果返回给商户端。notifyUrl表示异步通知即后台通知:第三方支付系统使用类似于HttpClient技术调用商户接口进行通知。前台通知的作用主要是提示给用户支付的状态,异步通知将支付结果安全的推送给商户端从而进行修改对应的订单状态,支付是否成功以异步通知为准。

  2、微信支付接入

  微信支付主要支持付款码支付、Native支付、JSAPI支付、APP支付、H5支付和小程序支付等,本文采用微信Native支付实现聚合支付系统的微信支付功能。

  如下图3所示为微信支付开发接入流程简单示意图。

图3 微信支付开发接入流程

  其中,微信Native支付可分为两种模式,商户可根据支付场景选择相应的支付模式。本文采用的是微信Native支付中的模式二,模式二与模式一相比流程更为简单,不依赖设置的回调支付URL。为了保证交易双方数据的安全性,需要对发送的数据进行签名,签名算法可以采用MD5算法或者HMAC-SHA256算法,请求和接收数据均需要校验签名,具体的签名方法如下:

  第一步,用集合M表示全部发送或者接收到的内容,按参数名ASCII码从小到大以字典序将集合M内非空参数值的参数进行排序,根据URL键值对的格式(即 keyl=valuel&key2=value2...)拼接成字符串 stringA。

  第二步,将key拼接至stringA结尾生成字符串stringSignTemp,同时使用MD5算法或HMAC-SHA256算法实施对stringSignTemp的计算,接着把运算结果中所有字符变更成大写,从而得到sign值sign Value。

  要接入微信支付开发者还需要集成服务端SDK,应用创建、支付申请以及SDK集成并配置完成后就可以调用具体的接口了。如下图4所示为微信Native支付的支付接口调用时序图。

 

图4 微信Native支付接口调用时序图

  3、银联支付接入

  银联支付主要支持在线网关支付、无跳转支付、手机网页支付以及企业网银支付等,本文采用的支付方式是银联全渠道支付的在线网关支付。如下图5所示为银联支付开发接入流程简单示意图。

图5 银联支付开发接入流程

  要为应用开通银联在线网关支付能力,开发者首先需要登陆到银联官网进行注册登陆并申请入网,然后申请获取签名证书、验签证书以及敏感信息加密证书等相关证书,签名证书和验签证书的使用方法如下:

  签名证书:首先通过key=value的方式根据名称来将报文里签名域(signature)以外的全部数据元排序,并且使用“&”将其拼接成待签名串。此外,使用SHA-256算法对待签名串进行摘要运算,通过银联颁发的签名证书中的私钥以及SHA-256签名算法对摘要进行签名运算。

  然后对签名串进行Base64编码操作并放入签名表单域中,而后利用HTTP Post的传输形式把签名表单域连同其他表单域一块传输至银联支付平台。

  验签证书:首先通过key=value的方法将报文中签名域(signature)以外的全部数据元根据名称实现升序排序,并且使用“&”将其拼接成待签名串。除此之外,还需要使用SHA-256算法对待签名串执行摘要运算,然后还需要通过在银联申请的验签证书里的公钥对摘要以及报文中的签名信息执行签名验证运算。

  要接入银联在线网关支付还需要在项目中集成并配置银联SDK,应用创建、入网申请、证书获取以及SDK集成并配置完成后就可以调用具体的接口了。如下图6所示为银联网关支付的支付接口调用时序图。

 

图6 银联在线网关支付接口调用时序图

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

西米支付:支付宝/微信支付/银联支付通道的接入介绍 的相关文章

  • Java 中等效的并行扩展

    我在 Net 开发中使用并行扩展有一些经验 但我正在考虑在 Java 中做一些工作 这些工作将受益于易于使用的并行库 JVM 是否提供任何与并行扩展类似的工具 您应该熟悉java util concurrent http java sun
  • Spring Batch 多线程 - 如何使每个线程读取唯一的记录?

    这个问题在很多论坛上都被问过很多次了 但我没有看到适合我的答案 我正在尝试在我的 Spring Batch 实现中实现多线程步骤 有一个包含 100k 条记录的临时表 想要在 10 个线程中处理它 每个线程的提交间隔为 300 因此在任何时
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • Java - 将节点添加到列表的末尾?

    这是我所拥有的 public class Node Object data Node next Node Object data Node next this data data this next next public Object g
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • Spark 1.3.1 上的 Apache Phoenix(4.3.1 和 4.4.0-HBase-0.98)ClassNotFoundException

    我正在尝试通过 Spark 连接到 Phoenix 并且在通过 JDBC 驱动程序打开连接时不断收到以下异常 为简洁起见 下面是完整的堆栈跟踪 Caused by java lang ClassNotFoundException org a
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • 在 Maven 依赖项中指定 jar 和 test-jar 类型

    我有一个名为 commons 的项目 其中包含运行时和测试的常见内容 在主项目中 我添加了公共资源的依赖项
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • 如何修复 JNLP 应用程序中的“缺少代码库、权限和应用程序名称清单属性”?

    随着最近的 Java 更新 许多人都遇到了缺少 Java Web Start 应用程序的问题Codebase Permissions and Application name体现属性 尽管有资源可以帮助您完成此任务 但我找不到任何资源综合的
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j

随机推荐

  • 二、Flink使用异步算子请求高德地图获取位置信息

    目录 Flink异步算子使用介绍 Flink使用异步算子请求高德地图获取位置信息代码实现 相关阅读 Flink使用异步算子 线程池查询MySQL 1 概述 1 Flink异步算子使用介绍 1 异步与同步概述 同步 向数据库发送一个请求然后一
  • 一步步学习SPD2010--第二章节--处理SP网站(6)---- 探索SP网站

    SP技术没有一个界面 你可以通过使用Web浏览器或者兼容程序如Office 应用程序 包括SPD 你可以选择适合你必须完成的任务的接口 然而 根据你选择的程序 你可能有SP网站的不同视图 如果你使用MS Word 你只看到了网站和内容的一小
  • 爆肝整理 JVM 十大模块知识点总结,不信你还不懂

    01 JVM 内存结构 Java 虚拟机的内存空间分为 5 个部分 程序计数器 Java 虚拟机栈 本地方法栈 堆 方法区 JDK 1 8 同 JDK 1 7 比 最大的差别就是 元数据区取代了永久代 元空间的本质和永久 代类似 都是对 J
  • 【ESP32开发】——RGB LED灯(灯珠)点亮

    一 引言 本章内容主要介绍如何使用ESP32开发板点亮板载的RGB灯 使用的是ESP32 S3和ESP32 C3开发板 调用第三方库实现 由于网络上没有关于点亮ESP32板载RGB灯的资料 特此记录 二 ESP32 C3与ESP32 S3
  • python怎么批量处理数据_python操作数据之批量添加数据

    import pymysql import random import time from datetime import datetime type dict 测试01 001 测试02 002 测试03 003 测试04 004 fid
  • bind详解

    bind与占位符 绑定普通函数 绑定成员函数 绑定函数对象 如果你还在使用bind1st bind2nd 那么恐怕已经out了 Boost提供了更强大的武器bind 用于函数对象的绑定 bind接受的第一个参数必须是可调用对象f 包括函数
  • CentOS7.2安装Weblogic12c出现的问题

    Weblogic12c安装到步骤 Prerequisite Checks 时 会进行操作系统版本的校验 即checking operating system certification 此处操作系统版本会校验不过去 如下图 解决方案 修改
  • 刷脸生物支付有唯一性和不可替代性

    刷脸支付的时代 特别是刷脸支付解决了扫码支付需要手机为载体的痛点 在移动支付中生物支付以其唯一性和不可替代性 正在逐步替代传统的金融支付工具 引领未来支付结算模式 移动支付衍生的刷脸支付其核心技术就是人工智能中人脸识别技术 刷脸支付自然也是
  • 0027算法笔记——【回溯法】回溯法与装载问题

    1 回溯法 1 描述 回溯法是一种选优搜索法 按选优条件向前搜索 以达到目标 但当探索到某一步时 发现原先选择并不优或达不到目标 就退回一步重新选择 这种走不通就退回再走的技术为回溯法 2 原理 回溯法在问题的解空间树中 按深度优先策略 从
  • 自定义时间Toast(只弹一次)

    CToast类 package com pinkman dota util import com pinkman dota R import android content Context import android graphics C
  • Linux 系统的运行级别(Run Level)

    Linux 操作系统自从开始启动至启动完毕需要经历几个不同的阶段 这几个阶段就叫做 Runlevel 同样 当Linux操作系统关闭时也要经历另外几个不同的 Runlevel 下面详细介绍一下 Runlevel 并展示一些小技巧来让Linu
  • 2021最新Java常用开源库总结,思维导图+源代码+笔记+项目

    蚂蚁金服 五面 蚂蚁金服 一面 一面就做了一道算法题 要求两小时内完成 给了长度为N的有重复元素的数组 要求输出第10大的数 典型的TopK问题 快排算法搞定 算法题要注意的是合法性校验 边界条件以及异常的处理 另外 如果要写测试用例 一定
  • 2020-10-24 无内容,请勿点击

    1024
  • idea启动Tomcat报错:Application Server was not connected before run configuration stop..

    使用IDEA开启Tomcat时候报了这么个错 Application Server was not connected before run configuration stop reason Unable to ping server a
  • Java3D的场景图结构

    Java3D的场景图结构 Java3D实际上是Java语言在三维图形领域的扩展 与Java一样 Java3D有纯粹的面向对象结构 Java3D的数据结构采用的是Scene Graphs Structure 场景图 就是一些具有方向性的不对称
  • java设计模式——观察者模式(Observer Pattern)

    概述 观察者模式是使用频率最高的设计模式之一 它用于建立一种对象与对象之间的依赖关系 一个对象发生改变时将自动通知其他对象 其他对象将相应作出反应 在观察者模式中 发生改变的对象称为观察目标 而被通知的对象称为观察者 一个观察目标可以对应多
  • [Linux用户空间编程-3]:Linux定时机制的几种实现方法

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 123376014 目录 前言 定时器的
  • 服务器查看内存条的参数信息,怎么查看服务器内存参数

    怎么查看服务器内存参数 内容精选 换一换 当您发现云服务器的运行速度变慢或云服务器突然出现网络断开现象 则可能是云服务器的带宽和CPU使用率过高导致 如果您已经通过云监控服务创建过告警任务 当CPU或带宽利用率高时 系统会自动发送告警给您
  • 《Head First HTML5 javascript》第9章 认识对象

    2022 11 21 第9章 认识对象 对象 对象是一个包含相关数据和方法的集合 通常由一些变量和函数组成 我们称之为对象里面的属性和方法 对象是存储在单个分组中的相关功能的集合 在 JavaScript 中 大多数事物都是对象 从作为核心
  • 西米支付:支付宝/微信支付/银联支付通道的接入介绍

    本文以电脑网站支付为例 着重对第三方支付通道的接入进行了分析 包括支付宝支付接入 微信支付接入及银联支付接入 1 支付宝支付接入 支付宝支付能力主要有当面付 刷脸付 App支付 手机网站支付 电脑网站支付和花呗分期等 本文采用电脑网站支付实