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

news2025/3/1 4:03:13

前文

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

  • 场景要求

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

  • 简单介绍
  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.coloradmin.cn/o/1346751.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GitHub 一周热点汇总 第3期 (2023/12/24-12/30)

GitHub一周热点汇总第三期 (2023/12/24-12/30)&#xff0c;梳理每周热门的GitHub项目&#xff0c;了解热点技术趋势&#xff0c;掌握前沿科技方向&#xff0c;发掘更多商机。元旦就要到了&#xff0c;提前祝大家新年快乐。 #1 StreamDiffusion 项目名称&#xff1a;StreamDiff…

Powermill各版本安装指南

下载链接 https://pan.baidu.com/s/1CsrYEUQNmDa820RxDV2G6Q?pwd0531 1.鼠标右击【PowerMill2024(64bit)】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;【解压到 PowerMill2024(64bit)】。 2.打开解压后的文件夹&#xff0c;双击打开【Setup】文…

Qt基础之四十五:Qt国际化(I18N)

国际化的英文表述为Internationalization,通常简写为I18N(首尾字母加中间的字符数),这种奇葩的缩写方式,让我想起了NBA球星“字母哥”。 下面看下Qt实现的动态语言切换效果。 一.效果 二.源码 QHSettingDialog.h #ifndef QHSETTINGDIALOG_H #define QHSETTINGDIALOG_H#…

获取Windows10系统原始安装日期

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 目标 获取Windows10系统最原始的安装日期&#xff1b;例如&#xff1a;刚买电脑时安装系统的时间。 步骤 第一步&#xff0c;请打开PowerShell&#xff0c;单击Windows P…

PAT 乙级 1033 旧键盘打字

旧键盘上坏了几个键&#xff0c;于是在敲一段文字的时候&#xff0c;对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键&#xff0c;打出的结果文字会是怎样&#xff1f; 输入格式&#xff1a; 输入在 2 行中分别给出坏掉的那些键、以及应该输入的文字。其…

使用Android Studio等idea工具开发flutter应用,必备的debug调试技能,非常好用

我们程序员不论开发什么软件&#xff0c;都需要一把锋利的调试工具&#xff0c;这是必不可少的&#xff0c;不然出现问题了&#xff0c;你都不知道问题是啥&#xff0c;出现在哪&#xff0c;就更别说怎么解决了。所以我这里就介绍一下android studio开发flutter必备的调试技能&…

ssrf之dict协议和file协议

1.dict协议 dict是什么协议呢&#xff1f; 定义&#xff1a;词典网络协议&#xff0c;在RFC 2009中进行描述。它的目标是超越Webster protocol&#xff0c;并允许客户端在使 用过程中访问更多字典。Dict服务器和客户机使用TCP端口2628。 官方介绍&#xff1a;http://dict.o…

【STM32】STM32学习笔记-PWM驱动LED呼吸灯 舵机 直流电机(16)

00. 目录 文章目录 00. 目录01. 输出比较相关API1.1 TIM_OC1Init1.2 TIM_OCInitTypeDef结构体1.3 TIM_OCMode1.4 TIM_OutputState1.5 TIM_OutputNState1.6 TIM_OCPolarity1.7 TIM_OCNPolarity1.8 TIM_OCPolarity1.9 TIM_OCNPolarity 02. PWM实现呼吸灯接线图03. PWM实现呼吸灯示…

livox avia平台搭建

硬件平台搭建 硬件平台的搭建除了livox雷达外还需要以下物料 焊接12V稳压模块接口 livox雷达需要12V的稳定电压供电,因此需要在电池与雷达之间加入8-35V转12V的稳压模块 组装 将各组建组装起来即可。 220V交流电供电 电池供电

数据结构 模拟实现LinkedList单向不循环链表

目录 一、链表的简单介绍 二、链表的接口 三、链表的方法实现 &#xff08;1&#xff09;display方法 &#xff08;2&#xff09;size得到单链表的长度方法 &#xff08;3&#xff09;addFirst头插方法 &#xff08;4&#xff09;addLast尾插方法 &#xff08;5&#xf…

迈向通用异常检测和理解:大规模视觉语言模型(GPT-4V)率先推出

PAPERCODEhttps://arxiv.org/pdf/2311.02782.pdfhttps://github.com/caoyunkang/GPT4V-for-Generic-Anomaly-Detection 图1 GPT-4V在多模态多任务异常检测中的综合评估 在这项研究中&#xff0c;我们在多模态异常检测的背景下对GPT-4V进行了全面评估。我们考虑了四种模式&#…

【起草】【第十二章】定制ChatGPT数字亲人

身为普普通通的我们&#xff0c;不知道亲人们在哪一天就要离开这个世界 &#xff1f; 作为普普通通的程序员&#xff0c;我们可以为我们的亲人做点什么 &#xff1f; 让他们以数字资产形式留在人世间 ? 对话&#xff5c;6岁女孩病逝捐器官&#xff0c;妈妈&#xff1a;她去…

缺失的第一个正数(LeetCode 41)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路4.1 暴力4.2 排序4.3 哈希表4.4 空间复杂度为 O(1) 的哈希表4.5 置换 参考文献 1.问题描述 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级…

【分布式配置中心】聊聊Apollo的安装与具体配置变更的原理

【管理设计篇】聊聊分布式配置中心 之前就写过一篇文章&#xff0c;介绍配置中心&#xff0c;但是也只是简单描述了下配置中心的设计点。本篇从apollo的安装到部署架构到核心原理进一步解读&#xff0c;大概看了下apollo的原理&#xff0c;感觉没有必要深究&#xff0c;所以就…

vscode软件安装步骤

目录 一、下载软件安装包 二、运行安装包后 一、下载软件安装包 打开vscode官方网址&#xff0c;找到下载界面 链接如下&#xff1a;Download Visual Studio Code - Mac, Linux, Windows 我是windows电脑&#xff0c;各位小伙伴自己选择合适的版本&#xff0c;点击下载按钮…

常用设计模式全面总结版(JavaKotlin)

这篇文章主要是针对之前博客的下列文章的总结版本: 《设计模式系列学习笔记》《Kotlin核心编程》笔记:设计模式【Android知识笔记】FrameWork中的设计模式主要为了在学习了 Kotlin 之后,将 Java 的设计模式实现与 Kotin 的实现放在一起做一个对比。 一、创建型模式 单例模…

2023 AI开发者生态报告

随着人工智能技术的飞速发展&#xff0c;全球IT市场对AI的投入持续增长&#xff0c;预计到2027年将达到4236亿美元。中国作为AI领域的重要参与者&#xff0c;其投资规模预计将占全球的9%。在这样的背景下&#xff0c;2023年的《AI开发者生态报告》为我们揭示了人工智能时代的技…

12.30_黑马数据结构与算法笔记Java

目录 320 全排列无重复 Leetcode47 321 组合 Leetcode77 分析 322 组合 Leetcode77 实现 323 组合 Leetcode77 剪枝 324 组合之和 Leetcode 39 325 组合之和 Leetcode 40 326 组合之和 Leetcode 216 327 N皇后 Leetcode51-1 328 N皇后 Leetcode51-2 329 解数独 Leetco…

喜迎元旦 | 愿新年,胜旧年,百华鞋业祝您元旦快乐,万事胜意!

一年复始岁序开&#xff0c;万象更新启新华 2023年我们聚力同行&#xff0c;相融共生&#xff0c; 凝心携手&#xff0c;奋进前行。 2024年我们挟着未知&#xff0c;带着期待&#xff0c; 继续携手砥砺前行 踏上新征程&#xff0c;向着新的奋斗目标再出发。 元旦&#xff…

C语言之整型提升

文章目录 1 有可能出现的问题2 产生以上问题的原因&#xff08;整型提升&#xff09;3 整型提升的过程4 整型提升示例5 总结 1 有可能出现的问题 代码如下 #include <stdio.h>int main () {int a -1;unsigned int b 1;if (a < b) {printf("a < b");}…