Ksher H5页面支付实例指导 (PHP实现)

背景

  • 前两天,公司的项目,为了满足泰国客户的支付需求,要求使用 Ksher (开时支付)
    对接任务突然就给了鄙人,一脸懵 …
    通过了解客户的使用场景、以及参考官网指导
    发现:Ksher支付 最令人满意的便是 —— 提供了便捷的 支付 Demo
    在此,做下梳理,希望能对小伙伴有所帮助,欢迎指摘 …

  • 简单介绍

  Ksher 成立于 2016 年,由红杉资本和 Infinity 投资,在 11 个国家设立运营公司,聚焦东南亚,为全球 150,000+ 企业提供支付服务。ksher 专注东南亚市场、深耕出口卖家生态,帮助中国卖家安全、高效、便捷地处理东南亚电商结算货款

  • 官方文档

【API 开发文档 >>>】
【SDK Support >>> 】 (满足 Java、Python、Go、PHP、Netcore、NodeJs


☛ 开发步骤

当前需求,是要满足 在手机 H5 页面,能在商品下单后,弹出支付二维码 (promptPay、trueMoney、card、wechat) , 引导去支付

①. 确认支付场景,选取参考代码

以我的场景需求和实际操作,想实现 H5页面的 Ksher支付,那么参考 【PHP - SDK Demo >>>】 中的 gateway_pay(WebSite) 这一部分即可

  • demo 演示页面如下:

②. 代码整合SDK

以我使用的 Yii2 框架 为例,将 php-sdk 文件放在了 common目录

  • 在提取使用时,其实就是对 ksher_pay_sdk.php 文件的 KsherPay类的使用
    为了避免直接改动 sdk 文件(方便出错排查),
    我复制了一份 ksher_pay_sdk文件,稍作个文件名和命名空间变动即可:

③. 实现下单流程

提取核心 下单逻辑代码,封装处理如下

    /*** @Notes:处理获取 Ksher支付数据 (gateway_pay 方式)* @param string $ksher_pay_order_sn	唯一的订单编号* @param int $ksher_sum_pay_amount		订单金额,例:25.50* @return array* @User: zhanghj* @DateTime: 2023-12-22 11:57*/public function dealGetKsherGatewayPayData($ksher_pay_order_sn = '',$ksher_sum_pay_amount = 0){$err_msg = '';$ksher_data = [];$ks_appid = PayMzConfig::KSHER_APP_ID;$ks_privatekey = PayMzConfig::KSHER_PRIVATE_KEY;$class = new KsherPay($ks_appid,$ks_privatekey);$gateway_pay_data = array('mch_order_no' => $ksher_pay_order_sn,"total_fee" => round($ksher_sum_pay_amount, 2) * 100,"fee_type" => 'THB',    //默认为泰铢"channel_list" => 'promptpay,truemoney,card,wechat',   //支付方式 wechat'mch_code' => $ksher_pay_order_sn,'mch_redirect_url' => 'http://www.ksher.cn','mch_redirect_url_fail' => 'http://www.ksher.cn','product_name' => PayMzConfig::KSHER_SHOW_PAY_PRODUCT_NAME,'refer_url' => 'http://www.ksher.cn',"mch_notify_url" => PayMzConfig::KSHER_H5_ORDER_PAY_NOTIFY,'device' => 'H5' //H5(手机端)、PC(电脑端));$gateway_pay_response = $class->gateway_pay($gateway_pay_data);$gateway_pay_array = json_decode($gateway_pay_response, true);if (isset($gateway_pay_array['data']['pay_content'])) {$ksher_data['pay_link'] = $gateway_pay_array['data']['pay_content']??'';}else{$failed_msg = $gateway_pay_array['msg']??'';$failed_message = $gateway_pay_array['message']??'';$failed_message = empty($failed_message)?(LanguageMz::CHECK_KSHER_PAY_AWAKE_FAILED):$failed_message;$err_msg = $failed_msg?$failed_msg:$failed_message;}return [$err_msg,$ksher_data];}
  • 重点是得到上面的 pay_link 数据,整理反馈给前端数据形式如下:
{"code": 200,"msg": "操作成功","data": {"pay_link": "https://gateway.ksher.com/h5?order_uuid=074ad88ca3c911ee9148525400962f26&lang=en"}
}

④. 实现效果

点击前面成功生成的支付链接,会直接跳转到 Ksher 支付唤醒页面,如下为 H5 页面(PC端同理)

  • 提示: 测试发现,如果手机端使用微信打开,会默认唤醒微信支付界面,同时支付金额自动由泰铢转化为人民币

⑤. 支付回调处理

对于支付回调的处理,参考 sdk 中提供的 demo_notify.php 文件代码进行实现

  • 根据业务功能,整理支付回调接口,处理如下:
    /*** @Notes:Ksher H5订单支付回调接口 (正式)* @User: zhanghj* @DateTime: 2023-12-22 11:46*/public function actionKsherH5OrderNotify(){//1.接收参数$input = file_get_contents("php://input");$query = urldecode($input);if( !$query){//记录日志信息CommonMzService::recordLocalFileLog('ksher_pay',"NO RETURN DATA" );echo json_encode(array('result'=>'FAIL',"msg"=>'NO RETURN DATA'));exit;}//2.验证参数$data_array = json_decode($query,true);CommonMzService::recordLocalFileLog('ksher_pay',"notify data :".json_encode( $data_array) );if( !isset( $data_array['data']) || !isset( $data_array['data']['mch_order_no']) || !$data_array['data']['mch_order_no']){echo json_encode(array('result'=>'FAIL',"msg"=>'RETURN DATA ERROR'));exit;}//3.处理订单if( array_key_exists("code", $data_array)&& array_key_exists("sign", $data_array)&& array_key_exists("data", $data_array)&& array_key_exists("result", $data_array['data'])&& $data_array['data']["result"] == "SUCCESS"){$ks_appid = PayMzConfig::KSHER_APP_ID;$ks_privatekey = PayMzConfig::KSHER_PRIVATE_KEY;$class = new KsherPay($ks_appid,$ks_privatekey);//3.1验证签名$verify_sign = $class->verify_ksher_sign($data_array['data'], $data_array['sign']);if( $verify_sign==1 ){//更新订单信息 change order status$pay_order_sn = $data_array['data']['mch_order_no'];$channel = $data_array['data']['channel']??'';$total_fee = $data_array['data']['total_fee']??'';$payment_json_str = json_encode($data_array,JSON_UNESCAPED_UNICODE);//TODO 此处为我的业务处理,可根据自己的业务,替换更新 ...(new PayMzService())->dealUpdateKsherGatewayPayOrder($pay_order_sn,$payment_json_str,$channel,$total_fee);echo json_encode(array('result'=>'SUCCESS',"msg"=>'OK'));} else {CommonMzService::recordLocalFileLog('ksher_pay','VERIFY_KSHER_SIGN_FAIL');echo json_encode(array('result'=>'Fail',"msg"=>'VERIFY_KSHER_SIGN_FAIL'));}}}

附录

1. 为什么 手机端的 H5 页面支付场景会是 显示支付二维码?

  通过了解,泰国常用的APP并非微信、支付宝,他们常用的支付APP 为 promptPay、trueMoney、VISA 等在H5页面,可以截图需要支付的二维码,打开支付APP,进行识别支付即可个人感觉,没有微信(国内)和支付宝使用方便

2. 源代码中,提到的 PayMzConfig 为支付配置类,方便后期对 Ksher 支付配置信息的改动

  • 摘取部分代码如下:
<?php
namespace common\enum;
/*** Mz 专用开发配置* Class PayMzConfig* @package common\enum*/
class PayMzConfig {//=================Ksher支付配置=============const KSHER_APP_ID = 'mch4XXXX';    //应用ID//私钥const KSHER_PRIVATE_KEY = <<<EOD
-----BEGIN RSA PRIVATE KEY-----
MIICYAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXGk34+n
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
u9UlGXXXXXXXXXXXXXXXXXXXXXXXXXXXXp9xJa
-----END RSA PRIVATE KEY-----
EOD;const KSHER_SHOW_PAY_PRODUCT_NAME = 'HWAPPU-Water';//TODO 配置为自己的支付回调接口const KSHER_H5_ORDER_PAY_NOTIFY = 'http://clientapi.xxxxx.com/notify/ksher_h5_order_notify';
}

3. 对于支付回调接口中提到的recordLocalFileLog()方法,可根据自己的代码,放在合适位置

    /*** @Notes:记录本地文件 日志信息* @param string $op_type* @param string $log_content* @return bool* @User: zhanghj* @DateTime: 2023-12-22 13:59*/public static function recordLocalFileLog($op_type = '',$log_content = '') {$time_stamp = date("Y-m-d H:i:s", time());if( !$log_content ) return false;if ($op_type == 'ksher_pay'){$log_file_name = 'ksher_pay';}else{$log_file_name = 'mz';}$file = dirname(Yii::$app->basePath)."/api/log/{$log_file_name}_".date("Ymd").".txt";$handle = fopen( $file, 'a+');fwrite( $handle , "[{$time_stamp}]: ".$log_content."\r");fclose( $handle );}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/225397.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

策略模式(组件协作)

策略模式&#xff08;组件协作&#xff09; 链接&#xff1a;策略模式实例代码 注解 目的 正常情况下&#xff0c;一个类/对象中会包含其所有可能会使用的内外方法&#xff0c;但是一般情况下&#xff0c;这些常使用的类都是由不同的父类继承、组合得来的&#xff0c;来实现…

基于Web的宠物医院信息管理系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本宠物医院信息管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据…

大一C语言查缺补漏 12.24

遗留问题&#xff1a; 6-1 1 在C语言中&#xff0c;如果要保留小数的话&#xff0c;一定要除以2.0&#xff0c;而不是2。 设整型变量m,n,a,b的值均为1&#xff0c;执行表达式&#xff08;m a>b&#xff09;||(n a<b)后&#xff0c;表达式的值以及变量m和n的值是&#…

虚拟机Windows Server 2012 与ubuntu的安装与布置

介绍虚拟机 虚拟机&#xff08;Virtual Machine&#xff0c;简称VM&#xff09;是一种通过软件模拟的计算机系统&#xff0c;可以在一台物理计算机上同时运行多个独立的操作系统和应用软件。虚拟机将物理计算机的硬件资源&#xff08;如处理器、内存、硬盘等&#xff09;虚拟化…

渗透测试 | php的webshell绕过方法总结

目录 1.php的异或运算 2.通过获取注释去绕过 3.利用字符的运算符 4.通过end函数代替[] 5.通过常量去绕过 6.字符串拼接双美元符 7.通过函数定义绕过 8.通过类定义&#xff0c;然后传参分割 9.多传参方式绕过 10.通过get_defined_functions绕过 本文由掌控安全学院 - …

快速入门学习定时任务框架-xxljob

定时任务框架-xxljob 简介 主要用于分布式任务调度&#xff0c;可以将任务调度和执行分布在多个节点上。它提供了一个集中式的管理平台&#xff0c;支持动态添加、修改、删除任务&#xff0c;以及任务的分片执行&#xff0c;确保任务在分布式环境中的高可用性的一个框架 spr…

SSL证书是什么?为什么需要SSL证书?

什么是SSL证书&#xff1f; SSL&#xff0c;全称为Secure Sockets Layer&#xff0c;是一种用于加密网络通信的协议。SSL证书是由一个可信赖的第三方机构颁发的数字证书&#xff0c;用于确保在用户与服务器之间传输的数据经过加密&#xff0c;保护用户隐私和信息安全。SSL证书…

【新资讯】《网络安全事件报告管理办法(征求意见稿)》正在公开征求意见

近年来网络安全事故频发&#xff0c;造成了不少损失和危害。为了减少网络安全事故的发生&#xff0c;规范网络安全事件的报告&#xff0c;国家互联网信息办公室根据《中华人民共和国网络安全法》等法律法规起草了《网络安全事件报告管理办法&#xff08;征求意见稿&#xff09;…

Qt前端技术:5.QSS

这个是表示QFrame中的pushButton中的子类和它子类的子类都将背景变为red 写成大于的时候表示只有直接的子类对象才会变 这个图中的QGroupBox和QPushButton都是QFrame的直接的子类 这个中的QGroupBox是QFrame的直接的子类但是QPushButton 是QGroupBox的子类&#xff0c;QPushB…

模拟EXCEL排序

7-78 模拟EXCEL排序 分数 25 全屏浏览题目 作者 陈越 单位 浙江大学 Excel可以对一组纪录按任意指定列排序。现请编写程序实现类似功能。 输入格式: 输入的第一行包含两个正整数N(≤105) 和C&#xff0c;其中N是纪录的条数&#xff0c;C是指定排序的列号。之后有 N行&am…

react中使用redux最简单最方便的方式,配合rematch简化操作,5分钟学会

react中使用状态管理的方式也很多&#xff0c;比如redux和mobx等&#xff0c;今天这一片就讲一下redux的入门到熟练使用&#xff0c;主要是要理解它redux的组成有哪些&#xff0c;到怎么创建&#xff0c;和组建中怎么使用三个问题。这里先放上官网文档&#xff0c;不理解的地方…

C语言--直接插入排序【排序算法|图文详解】

一.直接插入排序介绍&#x1f357; 直接插入排序又叫简单插入排序&#xff0c;是一种简单直观的排序算法&#xff0c;它通过构建有序序列&#xff0c;对于未排序的数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。 算法描述&#xff1a; 假设要排序…

Unity VR Pico apk安装失败:INSTALL_FAILED_UPDATE_INCOMPATIBLE

我的报错&#xff1a; PICO4企业版。安装apk&#xff0c;报错“安装失败。&#xff08;所属的Unity项目打包的apk&#xff0c;被我在同一台pico4安装了20次&#xff09; 调试方法&#xff1a; PIco4发布使用UNITY开发的Vr应用&#xff0c;格式为apk&#xff0c;安装的时候发生…

龙芯杯个人赛串口——做一个 UART串口——RS-232

文章目录 Async transmitterAsync receiver1. RS-232 串行接口的工作原理DB-9 connectorAsynchronous communicationHow fast can we send data? 2.波特率时钟生成器Parameterized FPGA baud generator 3.RS-232 transmitter数据序列化完整代码&#xff1a; 4.RS-232 receiver…

Linux之vim编辑器

目录 vim编辑器 vim编辑器指令 命令模式指令 光标相关 移动光标相关 文本操作 底行模式指令 插入模式 vim配置 vimforcpp 面试官&#xff1a;小伙子&#xff0c;你是用什么环境编写代码的&#xff1f; 小明&#xff1a;vs2019 面试官&#xff1a;小伙子&#xff0c…

基于AT89C51单片机的8位密码锁仿真与实物制作

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/88657969?spm1001.2014.3001.5503 源码获取 C 源码仿真图毕业设计实物制作步骤01 摘要 在日常的生活和工作中, 住宅与部门的安全防范、单位的文件档案、财务报表…

web前端html笔记2

新增状态标签<meter><progress> <meter> 属性 值 描述 high 数值 规定高值 low 数值 规定低值 max 数值 规定最大值 min 数值 规定最小值 optimum 数值 规定最优值 value 数值 规定当前值 <body> <meter high"50" …

【Qt之Quick模块】5. QML基本类型及示例用法

QML格式 以下是一个QML文件 import QtQuick 2.12Window {id: mainWindowwidth: 400height: 300visible: truetitle: "My QML Application"Rectangle {id: rectwidth: 200height: 100color: "red"Text {id: textItemtext: "Hello World!"font.p…

ueditor富文本编辑器中图片上传地址配置以及抓取远程图片地址的配置

一&#xff1a;图片上传保存地址配置 打开文件ueditor.php,找到imagePathFormat进行修改即可 一&#xff1a;远程抓取图片配置 打开文件ueditor.config.js,找到catchRemoteImageEnable&#xff0c;取消注释即可

python dash 写一个登陆页 4

界面 代码&#xff1a; 这里引入了dash_bootstrap_components 进行界面美化 &#xff0c;要记一些className&#xff0c;也不是原来说的不用写CSS了。 from dash import Dash, html, dcc, callback, Output, Input, State import dash_bootstrap_components as dbc app Dash…