聚合支付解决方案

1.解决方案介绍

聚合支付,是融合了多方支付通道的平台,相对于支付宝、微信等第三方支付平台而言,聚合支付属于在第三方支付平台基础上,进行了技术融合的第四方平台。

本解决方案,是基于PC网站,集成聚合支付中的扫码支付方式,实现支付宝、微信同码的一种基础方案。

聚合支付原理图:

2.开通聚合支付服务

很多平台都提供了聚合支付服务,以下使用ping++聚合支付。

2.1 注册账号

访问 Ping++官网,注册账号并登录。

提交注册申请后,请前往注册邮箱,在邮件中点击注册链接,创建密码后进入管理平台。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Arln40Nm-1677340506362)(img/1561165614535.png)]

2.2 开发信息配置

参见官方文档:https://www.pingxx.com/docs/overview/config

2.2.1 Test 和 Live 环境

为了提高接入效率,Ping++ 提供了 Live 和 Test 两个工作模式供开发者接入时使用,两个环境均需要设置 AppID,两个环境的变更可以通过代码中的 Live Key 和 Test Key 的切换。

Test 环境

调用 Test 环境只需要注册 Ping++ 账户, Test 环境便于商户在没有申请下来渠道参数时先跑通支付流程,Test 开发中支付页面是 Ping++ 提供的模拟页面,不需要输入密码,直接点击支付即完成模拟付款。

Live 环境

调用 Live 环境需要商户已经和 Ping++ 签约并且成功完成渠道申请,将渠道参数填写在 Ping++ 管理平台上对应的渠道。 在 Live 环境下可以调用第三方渠道控件完成真实的付款。(参见 管理平台使用指南https://www.pingxx.com/docs/overview/dashboard)

2.2.2 获取 Test Key 和 Live Key

Test 和 Live 环境的 Key 均需要登录 Ping++ 管理平台获得

使用Live环境需要进行企业信息认证。

具体获取路径:点击管理平台右上角公司名称->企业面板->开发参数->基本密钥

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qy9MbD63-1677340506364)(img/dashboard_key1.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-962BeMUe-1677340506364)(img/dashboard_key2.png)]

2.2.3 获取 App ID

App ID 是你在 Ping++ 平台上创建的应用标识,平台默认提供一个应用,完善企业信息后可添加新应用。

具体获取路径:登陆管理平台->点击「主页」按钮->对应的应用名称下方会显示 App_ID

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vQBELN7o-1677340506365)(img/dashboard_appid1.png)]

2.2.4 获取 Ping++ 公钥

Ping++ 公钥用于 Webhooks 真实性验证,验证该异步通知是否来自于 Ping++ 。 Ping++ 公钥具体获取路径:点击管理平台右上角公司名称->企业面板->开发参数->基本密钥

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LglOYu0s-1677340506368)(img/dashboard_key1.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rbKHRnNc-1677340506369)(img/dashboard_pingxxpub.png)]

其中,RSA密钥设置,见https://help.pingxx.com/article/123161

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3PZulzkD-1677340506371)(img/1561166691097.png)]

通过一键生成工具 生成商户私钥和公钥

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W5uvDaqF-1677340506373)(img/1561166770207.png)]

将商户私钥、商户公钥、Ping++公钥 分别复制保存在文件中备用。

2.2.5 webhooks异步通知

点击应用名称,进入应用详情页

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x8yJhdca-1677340506374)(img/1561174598587.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7FHq5tdE-1677340506375)(img/1561174688082.png)]

展开左侧菜单,找到应用设置-》webhooks

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OwZbbtWW-1677340506376)(img/1561174754465.png)]

进入webhooks页面,点击右上角添加,添加通知地址

注:此地址,需要是外网可访问地址,否则异步通知会失败。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4hrVdai0-1677340506385)(img/1561174798815.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-80zlOFyu-1677340506386)(img/1561174854177.png)]

2.3 扫码支付

参见扫码支付

概述和流程https://www.pingxx.com/docs/overview/basic_transaction/charge_refunds/qr?basic_transaction=true

Server端接入<https://www.pingxx.com/docs/server/basic_transaction/charge_refunds/qr?basic_transaction=true>

扫码支付分为 用户主扫用户被扫 两种支付场景,用户主扫 又分为 动态码固定码 两种方式。

本解决方案,基于 用户主扫 场景的 动态码 方式,实现了微信、支付宝同码的扫码支付功能。

流程参考:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RAgeq1xx-1677340506387)(img/qr_paymentflow.png)]

3.项目集成聚合支付

3.1 数据库设计

基于现有PC网站订单相关数据表,新增 支付记录表 (仅实现支付功能,未考虑退款等功能)。

3.1.1 支付记录表

CREATE TABLE `pyg_pay_log` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`order_sn` varchar(255) DEFAULT NULL COMMENT '订单编号',`json` text COMMENT '通知数据',`create_time` int(11) DEFAULT NULL,`update_time` int(11) DEFAULT NULL,`delete_time` int(11) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

3.1.2 创建模型

项目目录>  php think make:model common\PayLog;

3.2 聚合支付

参见api文档:https://www.pingxx.com/api

基础交易 – Charges支付

Webhooks回调

附录–支付渠道属性值

3.2.1 服务器环境部署

项目目录下,执行以下命令,安装ping++功能包,用于聚合支付

composer require pingplusplus/pingpp-php

ping++功能说明地址:https://github.com/PingPlusPlus/pingpp-php

项目目录下,执行以下命令,安装qr-code功能包,用于生产二维码

composer require endroid/qr-code

二维码功能地址:https://github.com/endroid/qr-code

3.2.2 生成支付二维码

控制器文件 application/home/controller/Order.php 中 save 方法

创建订单成功后,展示支付方式页面之前,定义扫码支付链接,生成二维码图片,用于支付页面展示

public function save()
{//创建订单代码开始//...//创建订单代码结束//二维码图片中的支付链接(本地项目自定义链接,传递订单id参数)//$url = url('/home/order/qrpay', ['id'=>$order->order_sn], true, true);//用于测试的线上项目域名 http://pyg.tbyue.com$url = url('/home/order/qrpay', ['id'=>$order->order_sn, 'debug'=>'true'], true, "http://pyg.tbyue.com");//生成支付二维码$qrCode = new \Endroid\QrCode\QrCode($url);//二维码图片保存路径(请先将对应目录结构创建出来,需要具有写权限)$qr_path = '/uploads/qrcode/'.uniqid(mt_rand(100000,999999), true).'.png';//将二维码图片信息保存到文件中$qrCode->writeFile('.' . $qr_path);$this->assign('qr_path', $qr_path);//展示支付页面//...
}

视图文件 application/home/view/order/pay.html中

标签内部,增加以下 需增加代码部分
<div class="checkout py-container  pay"><!--其他代码--><!--需增加的代码开始--><div class="qrpay"><div class="step-tit"><h5>扫码付(支持支付宝、微信)</h5></div><div class="step-cont"><img src="{$qr_path}" style="width:200px;height:200px;"></div></div><!--需增加的代码结束--><!--其他代码-->
</div>

3.2.3 ping++信息配置

将商户私钥文件(比如命名为 pingpp_rsa_private_key.pem ),移动到项目public目录下

配置文件 application/config.php中,新增以下配置项

 //ping++聚合支付'pingpp' => ['api_key' => 'sk_test_KOGmH8SSuzrDOmLiDCzX9eX9',//test_key 或 live_key'app_id' => 'app_nTG0uPa5OWH4mH0m',// 应用app_id'private_key_path' => './pingpp_rsa_private_key.pem' //商户私钥文件路径],

3.2.4 扫码支付功能

控制器文件 application/home/controller/Order.php中

创建qrpay方法,完成扫码支付功能(对应于支付二维码中的链接地址)

 //扫码支付public function qrpay(){$agent = request()->server('HTTP_USER_AGENT');//判断扫码支付方式if ( strpos($agent, 'MicroMessenger') !== false ) {//微信扫码$pay_code = 'wx_pub_qr';}else if (strpos($agent, 'AlipayClient') !== false) {//支付宝扫码$pay_code = 'alipay_qr';}else{//默认为支付宝扫码支付$pay_code = 'alipay_qr';}//接收订单id参数$order_sn = input('id');//创建支付请求$this->pingpp($order_sn,$pay_code);}

创建pingpp方法,用于发起支付请求到ping++

 //发起ping++支付请求public function pingpp($order_sn,$pay_code){//查询订单信息$order = \app\common\model\Order::where('order_sn', $order_sn)->find();//ping++聚合支付\Pingpp\Pingpp::setApiKey(config('pingpp.api_key'));// 设置 API Key\Pingpp\Pingpp::setPrivateKeyPath(config('pingpp.private_key_path'));// 设置私钥\Pingpp\Pingpp::setAppId(config('pingpp.app_id'));$params = ['order_no'  => $order['order_sn'],'app'       => ['id' => config('pingpp.app_id')],'channel'   => $pay_code,'amount'    => $order['order_amount'],'client_ip' => '127.0.0.1','currency'  => 'cny','subject'   => 'Your Subject',//自定义标题'body'      => 'Your Body',//自定义内容'extra'     => [],];if($pay_code == 'wx_pub_qr'){$params['extra']['product_id'] = $order['id'];}//创建Charge对象$ch = \Pingpp\Charge::create($params);//跳转到对应第三方支付链接$this->redirect($ch->credential->$pay_code);die;}

3.2.5 异步通知

根据 2.2.5 添加的异步通知地址,创建对应控制器方法,

比如Notify控制器(application/home/controller/Notify.php), pingpp方法

思路:

接收参数,验证签名

验签成功,则修改订单状态,记录通知信息到支付记录表,返回响应成功码

验签失败,返回响应失败码

<?phpnamespace app\home\controller;use think\Controller;class Notify extends Controller
{//ping++异步通知 (webhooks)public function pingpp(){try{//接收参数$params = file_get_contents("php://input");//获取请求头信息,用于获取签名$headers = \Pingpp\Util\Util::getRequestHeaders();// 签名在头部信息的 x-pingplusplus-signature 字段$signature = isset($headers['X-Pingplusplus-Signature']) ? $headers['X-Pingplusplus-Signature'] : null;//获取ping++公钥用于签名$pub_key_path = "./pingpp_rsa_public_key.pem";$pub_key_contents = file_get_contents($pub_key_path);//验证签名$result = openssl_verify($params, base64_decode($signature), $pub_key_contents, 'sha256');if ($result === 1) {// 验证通过$event = json_decode($params, true);// 对异步通知做处理if (!isset($event['type'])) {header($_SERVER['SERVER_PROTOCOL'] . ' 400 Bad Request');exit("fail");}switch ($event['type']) {case "charge.succeeded":// 开发者在此处加入对支付异步通知的处理代码//修改订单状态$order_sn = $event['data']['object']['order_no'];$order = \app\common\model\Order::where('order_sn', $order_sn)->find();if(empty($order)){header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found');exit("fail");}$order->order_status = 1;//已付款、待发货$order->pay_code = $event['data']['object']['channel'];$order->pay_name = $event['data']['object']['channel'] == 'wx_pub_qr' ? '微信支付' : '支付宝';$order->save();\app\common\model\PayLog::create(['order_sn' => $order_sn, 'json' => $params]);header($_SERVER['SERVER_PROTOCOL'] . ' 200 OK');break;case "refund.succeeded":// 开发者在此处加入对退款异步通知的处理代码header($_SERVER['SERVER_PROTOCOL'] . ' 200 OK');break;default:header($_SERVER['SERVER_PROTOCOL'] . ' 400 Bad Request');break;}} elseif ($result === 0) {http_response_code(400);echo 'verification failed';exit;} else {http_response_code(400);echo 'verification error';exit;}}catch (\Exception $e){$msg = $e->getMessage();http_response_code(500);echo $msg;exit;}}
}

3.2.5 支付结果轮询

控制器文件 application/home/controller/Order.php 中新增status 方法

用于查询订单状态

 //查询订单状态public function status(){//接收订单编号$order_sn = input('order_sn');//查询订单状态/*$order_status = \app\common\model\Order::where('order_sn', $order_sn)->value('order_status');return json(['code' => 200, 'msg' => 'success', 'data'=>$order_status]);*///通过线上测试$res = curl_request("http://pyg.tbyue.com/home/order/status/order_sn/{$order_sn}");echo $res;die;}

视图页面application/home/view/order/pay.html 新增js代码

用于轮询订单状态

<script>$(function(){//轮询, 查询支付状态var order_sn = "{$order_sn}";var timer = setInterval(function(){$.ajax({"url":"{:url('home/order/status')}","type":"post","data":"order_sn=" + order_sn,"dataType":"json","success":function(res){if(res.code == 200 && res.data == 1){clearInterval(timer);location.href = "{:url('home/order/payresult')}?order_sn=" + order_sn;}}});}, 1000);})</script>

支付结果页面 Order控制器

public function payresult(){$order_sn = input('order_sn');$order = \app\common\model\Order::where('order_sn', $order_sn)->find();if(empty($order)){return view('payfail', ['msg' => '订单编号错误']);}else{return view('paysuccess', ['pay_name' => $order->pay_name, 'order_amount'=>$order['order_amount'], 'order' => $order]);}}

3.3 支付流程演示

订单提交成功,支付页面显示支付二维码

打开手机支付宝或者手机微信扫一扫,扫描图中二维码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HfcXoNyj-1677340506390)(img/1561176196118.png)]

点击 付款 ,模拟 付款成功 状态, ping++平台会调用项目的webhooks异步通知接口。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HyIpaxy2-1677340506391)(img/1561176173199.png)]

订单表数据: 订单状态order_status 为1,表示支付成功。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uzIxSLNf-1677340506392)(img/1561176363805.png)]

支付记录表:新增了订单对应支付记录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LGZwd0Hs-1677340506393)(img/1561176449372.png)]

PC浏览器页面 跳转到 支付结果 页面

4.总结

聚合支付,是融合了多方支付通道的平台,相对于支付宝、微信等第三方支付平台而言,聚合支付属于在第三方支付平台基础上,进行了技术融合的第四方平台。

本解决方案,是基于PC网站,集成聚合支付中的扫码支付方式,实现支付宝、微信同码的一种基础方案。

主要实现步骤为:开通聚合支付服务(真实环境需要开通第三方支付渠道),配置开发信息,项目集成。

项目集成又包含:生成支付二维码,扫码支付请求ping++的创建change对象接口、处理异步通知、支付结果轮询等。

13-pyg-12聚合支付解决方案相关推荐

  1. 2021年全球B2B在线支付解决方案行业调研及趋势分析报告

    本文研究全球市场.主要地区和主要国家B2B在线支付解决方案的收入等,同时也重点分析全球范围内主要企业竞争态势,B2B在线支付解决方案收入和市场份额等.针对过去五年(2016-2020)年的历史情况,分 ...

  2. 汇付聚合支付自助接入的一点经验分享

    近日,看到有些朋友在提问如何对接聚合支付,本人近期刚好对接过一家三方支付,有一点经验心得,算是供大家参考吧,不喜勿喷. 本人对接的聚合支付是一家三方支付的聚合支付解决方案,叫汇付天下聚合支付自助接入解 ...

  3. 汇付聚合支付自助接入解决方案快捷支付接口代码详解

    上篇文章 <汇付聚合支付自助接入的一点经验分享> 发出后,受到众多朋友的阅读与评论,在此感谢大家的厚爱.看有些朋友评论说:很有用,能不能再讲具体一点,今天我就应大伙需求,来具体讲一讲里面的 ...

  4. 高校聚合支付平台设计解决方案

    1.传统校园支付的现状与困境 近年来,随着学校的快速发展,招生规模也在不断扩大,各项收费标准不断提高且收费所涉及的种类也日渐增多.学校的各种收费模式也从"现场收取现金"逐渐发展到& ...

  5. 主流聚合支付对比分析【转】

    前言 最近准备做聚合支付相关的产品,做新产品除了要知道自己做什么还要知道目前的竞品都做了些什么,所以对目前市面上的主流聚合支付产品做了对比分析,每家产品的一些实现细节,这里出于保护没有明确写出来,其实 ...

  6. 《中国聚合支付行业发展报告2018》发布 深度分析未来八大趋势

    2018年12月27日,派盟咨询在北京正式发布<中国聚合支付行业发展报告2018>.派盟互通联合创始人.意锐新创COO关恒在报告发布会上表示:高速增长的聚合支付行业正在进入合规发展新阶段, ...

  7. 中国聚合支付市场深度调研及投资前景预测报告2022-2028年

    中国聚合支付市场深度调研及投资前景预测报告2022-2028年 ═━┈┈━══━┈┈━══━┈┈━══━    [出版机构]:  中商经济研究网 第1章 中国聚合支付行业发展综述 1.1 聚合支付行业 ...

  8. 第三方支付下半场:聚合支付?

    历史上尽管金融支付的方式不断更新变化,但它创新的目标始终没变,就是促进人类的商品交换."1月20日,北京金融控股集团有限公司董事长范文仲在"新技术对金融的影响与变革"20 ...

  9. 全球与中国聚合支付平台市场深度研究分析报告

    [报告篇幅]:112 [报告图表数]:142 [报告出版时间]:2022年3月 报告摘要 本文研究全球及中国市场聚合支付平台现状及未来发展趋势,侧重分析全球及中国市场的主要企业,同时对比北美.欧洲.中 ...

最新文章

  1. 字符串按长度转换成数组
  2. 成功解决OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cv::cvtColor
  3. HDU 1618 Oulipo KMP解决问题的方法
  4. bmw info source
  5. Bootstrap3基础 clearfix pull-left/right 辅助类样式 快速左右浮动
  6. Spring mvc Controller接口
  7. 这就是即将发布的苹果刘海屏MacBook Pro样机?
  8. ActiveMQ 即时通讯服务 浅析
  9. PyQt Graphics View 一个hello world例子
  10. springboot requestmapping 正则_SpringBoot三招组合拳,手把手教你打出优雅的后端接口...
  11. java 字符串查找程序,查找字符串的所有子集的Java程序
  12. android dumpsys 分析,Android中dumpsys命令用法简单介绍
  13. 怎么给视频添加水印?几个简单的步骤就搞定
  14. 遭遇盗取网络游戏帐号木马等
  15. pygame 窗口标题和图标设置
  16. Glidedsky系列—爬虫CSS反爬
  17. 小i机器人受邀出席首尔亚洲金融论坛
  18. Python脚本--别踩小bai块
  19. CPU玩游戏温度过高,导热硅脂有何妙招解决?
  20. this.$emit is not a function

热门文章

  1. 通俗易懂介绍英语中Being与having been 的区分
  2. js 操作元素属性、操作元素样式、display(none、block)
  3. itween 参数类型easeTypes的显示demo
  4. php批量随机生成数字不重复,php批量随机生成数字不重复
  5. Pandas的 loc iloc ix 区别
  6. 面向对象学不会看不懂?一文详解面向对象知识点总结
  7. LeetCode刷题day50
  8. java实现邮件发送_基于JavaMail的Java实现简单邮件发送功能
  9. Vue CSS多图宫格布局
  10. zpl php,php – 如何在垂直标签中垂直打印zpl条形码