


Following the update trend, the guaranteed payment class of the PHP byte applet has also been updated!
The WeChat payment class update is over. I turned around and found that ByteDance has also updated payment. So following the trend, I also updated the ByteDance payment class. The new version uses the latest version of the V1 interface (guarantee Payment introduction), and a new composer
installation is added to facilitate the use of the integrated framework (Github address)
can also be copied and used separately:
(Note: Due to business needs, only relevant methods are written, not yet tested, for reference only)
First fill in the configuration file completely:
Payment class encapsulation related methods:
method | Description |
---|---|
createOrder | Place an order and pay |
Order query | |
Order callback verification | |
Order refund | |
Refund query | |
Settle request | |
Settle query |
<?php require_once('./vendor/autoload.php'); $config = []; // 支付配置 $order = [ 'order_sn' => time(), // 订单编号 'total_amount' => 1, // 订单金额(分) 'body' => '测试商品', // 商品名称 ]; $wechat = new fengkui\Pay\Bytedance($config); $re = $wechat->createOrder($order); die(json_encode($re)); // JSON化直接返回小程序客户端
<?php /** * @Author: [FENG] <1161634940@qq.com> * @Date: 2020-05-13 17:02:49 * @Last Modified by: [FENG] <1161634940@qq.com> * @Last Modified time: 2021-06-15T17:06:18+08:00 */ namespace fengkui\Pay; use fengkui\Supports\Http; /** * Bytedance 字节跳动支付 * 小程序担保支付(V1) */ class Bytedance { // 接口版本 const EDITON = 'v1'; // 统一下订单管理 private static $ecpayUrl = 'https://developer.toutiao.com/api/apps/ecpay/'; // 服务端预下单 private static $createOrderUrl = 'https://developer.toutiao.com/api/apps/ecpay/v1/create_order'; // 订单查询 private static $queryOrderUrl = 'https://developer.toutiao.com/api/apps/ecpay/v1/query_order'; // 退款 private static $createRefundUrl = 'https://developer.toutiao.com/api/apps/ecpay/v1/create_refund'; // 查询退款 private static $queryRefundUrl = 'https://developer.toutiao.com/api/apps/ecpay/v1/query_refund'; // 分账请求 private static $settleUrl = 'https://developer.toutiao.com/api/apps/ecpay/v1/settle'; // 查询分账 private static $querySettleUrl = 'https://developer.toutiao.com/api/apps/ecpay/v1/query_settle'; // 服务商进件 private static $addMerchantUrl = 'https://developer.toutiao.com/api/apps/ecpay/saas/add_merchant'; // 分账方进件 private static $addSubMerchantUrl = 'https://developer.toutiao.com/api/apps/ecpay/saas/add_sub_merchant'; // 支付相关配置 private static $config = array( 'app_id' => '', // App ID 'salt' => '', // 支付密钥值 'notify_url' => '', // 支付回调地址 'thirdparty_id' => '', // 第三方平台服务商 id,非服务商模式留空 ); /** * [__construct 构造函数] * @param [type] $config [传递支付相关配置] */ public function __construct($config=NULL){ $config && self::$config = array_merge(self::$config, $config); } /** * [createOrder 下单支付] * @param [type] $order [description] * @return [type] [description] * $order = array( * 'body' => '', // 产品描述 * 'total_amount' => '', // 订单金额(分) * 'order_sn' => '', // 订单编号 * ); */ public static function createOrder($order) { $config = self::$config; $params = [ 'app_id' => $config['app_id'], // 是 小程序 AppID 'out_order_no' => (string)$order['order_sn'], // 是 开发者侧的订单号, 同一小程序下不可重复 'total_amount' => $order['total_amount'], // 是 支付价格; 接口中参数支付金额单位为[分] 'subject' => $order['body'], // 是 商品描述; 长度限制 128 字节,不超过 42 个汉字 'body' => $order['body'], // 是 商品详情 'valid_time' => 3600 * 2, // 是 订单过期时间(秒); 最小 15 分钟,最大两天 // 'sign' => '', // 是 开发者对核心字段签名, 签名方式见文档附录, 防止传输过程中出现意外 // 'cp_extra' => '', // 否 开发者自定义字段,回调原样回传 // 'notify_url' => $config['notify_url'], // 否 商户自定义回调地址 // 'thirdparty_id' => '', // 否 第三方平台服务商 id,非服务商模式留空 'disable_msg' => 1, // 否 是否屏蔽担保支付的推送消息,1-屏蔽 0-非屏蔽,接入 POI 必传 // 'msg_page' => '', // 否 担保支付消息跳转页 // 'store_uid' => '', // 否 多门店模式下,门店 uid ]; !empty($order['cp_extra']) && $params['cp_extra'] = $order['cp_extra']; !empty($config['notify_url']) && $params['notify_url'] = $config['notify_url']; !empty($config['thirdparty_id']) && $params['thirdparty_id'] = $config['thirdparty_id']; if (!empty($config['msg_page'])) { $params['disable_msg'] = 0; $params['msg_page'] = $config['msg_page']; } $params['sign'] = self::makeSign($params); // dump($params);die; $url = self::$createOrderUrl; $response = Http::post($url, json_encode($params)); $result = json_decode($response, true); return $result; } /** * [queryOrder 订单查询] * @param [type] $orderSn [开发者侧的订单号, 不可重复] * @return [type] [description] */ public static function queryOrder($orderSn) { $config = self::$config; $params = [ 'app_id' => $config['app_id'], // 小程序 AppID 'out_order_no' => (string)$orderSn, // 开发者侧的订单号, 不可重复 // 'sign' => '', // 开发者对核心字段签名, 签名方式见文档, 防止传输过程中出现意外 // 'thirdparty_id' => '', // 服务商模式接入必传 第三方平台服务商 id,非服务商模式留空 ]; !empty($config['thirdparty_id']) && $params['thirdparty_id'] = $config['thirdparty_id']; $params['sign'] = self::makeSign($params); $url = self::$queryOrderUrl; $response = Http::post($url, json_encode($params)); $result = json_decode($response, true); return $result; } /** * [notifyOrder 订单回调验证] * @return [array] [返回数组格式的notify数据] */ public static function notifyOrder() { $data = $_POST; // 获取回调数据 $config = self::$config; if (!$data || empty($data['msg'])) die('暂无回调信息'); $result = json_decode($data['msg'], true); // 进行签名验证 // 判断签名是否正确 判断支付状态 if ($result && $data['type']=='payment') { return $data; } else { return false; } } /** * [createRefund 订单退款] * @param [type] $order [订单相关信息] * @return [type] [description] * $order = array( * 'order_sn' => '', // 订单编号 * 'refund_sn' => '', // 退款编号 * 'total_amount' => '', // 订单金额(分) * 'body' => '', // 退款原因 * ); */ public static function createRefund($order) { $config = self::$config; $params = [ 'app_id' => $config['app_id'], // 是 小程序 id 'out_order_no' => (string)$order['order_sn'], // 是 商户分配订单号,标识进行退款的订单 'out_refund_no' => (string)$order['refund_sn'], // 是 商户分配退款号 'refund_amount' => $order['total_amount'], // 是 退款金额,单位[分] 'reason' => $order['body'] ?? '用户申请退款', // 是 退款理由,长度上限 100 // 'cp_extra' => '', // 否 开发者自定义字段,回调原样回传 // 'notify_url' => '', // 否 商户自定义回调地址 // 'sign' => '', // 是 开发者对核心字段签名, 签名方式见文档, 防止传输过程中出现意外 // 'thirdparty_id' => '', // 否,服务商模式接入必传 第三方平台服务商 id,非服务商模式留空 'disable_msg' => 1, // 否 是否屏蔽担保支付消息,1-屏蔽 // 'msg_page' => '', // 否 担保支付消息跳转页 // 'all_settle' => '', // 否 是否为分账后退款,1-分账后退款;0-分账前退款。分账后退款会扣减可提现金额,请保证余额充足 ]; !empty($order['cp_extra']) && $params['cp_extra'] = $order['cp_extra']; !empty($order['all_settle']) && $params['all_settle'] = $order['all_settle']; !empty($config['thirdparty_id']) && $params['thirdparty_id'] = $config['thirdparty_id']; if (!empty($config['msg_page'])) { $params['disable_msg'] = 0; $params['msg_page'] = $config['msg_page']; } $params['sign'] = self::makeSign($params); $url = self::$queryOrderUrl; $response = Http::post($url, json_encode($params)); $result = json_decode($response, true); return $result; } /** * [queryRefund 退款查询] * @param [type] $refundSn [开发者侧的订单号, 不可重复] * @return [type] [description] */ public static function queryRefund($refundSn) { $config = self::$config; $params = [ 'app_id' => $config['app_id'], // 小程序 AppID 'out_refund_no' => $refundSn, // 开发者侧的退款号 // 'sign' => '', // 开发者对核心字段签名, 签名方式见文档, 防止传输过程中出现意外 // 'thirdparty_id' => '', // 服务商模式接入必传 第三方平台服务商 id,非服务商模式留空 ]; !empty($config['thirdparty_id']) && $params['thirdparty_id'] = $config['thirdparty_id']; $params['sign'] = self::makeSign($params); $url = self::$queryRefundUrl; $response = Http::post($url, json_encode($params)); $result = json_decode($response, true); return $result; } /** * [notifyRefund 退款回调验证] * @return [array] [返回数组格式的notify数据] */ public static function notifyRefund() { $data = $_POST; // 获取回调数据 $config = self::$config; if (!$data || empty($data['status'])) die('暂无回调信息'); $result = json_decode($data['msg'], true); // 进行签名验证 // 判断签名是否正确 判断支付状态 if ($result && $data['status']!='FAIL') { return $data; } else { return false; } } /** * [settle 分账请求] * @param [type] $order [分账信息] * @return [type] [description] * $order = array( * 'body' => '', // 产品描述 * 'total_amount' => '', // 订单金额(分) * 'order_sn' => '', // 订单编号 * ); */ public static function settle($order) { $config = self::$config; $params = [ 'app_id' => $config['app_id'], // 是 小程序 AppID 'out_order_no' => (string)$order['order_sn'], // 是 商户分配订单号,标识进行结算的订单 'out_settle_no' => (string)$order['settle_sn'], // 是 开发者侧的结算号, 不可重复 'settle_desc' => $order['body'], // 是 结算描述,长度限制 80 个字符 // 'cp_extra' => '', // 否 开发者自定义字段,回调原样回传 // 'notify_url' => '', // 否 商户自定义回调地址 // 'sign' => '', // 是 开发者对核心字段签名, 签名方式见文档, 防止传输过程中出现意外 // 'thirdparty_id' => '', // 否,服务商模式接入必传 第三方平台服务商 id,非服务商模式留空 // 'settle_params' => '', // 否,其他分账方信息,分账分配参数 SettleParameter 数组序列化后生成的 json 格式字符串 ]; !empty($order['cp_extra']) && $params['cp_extra'] = $order['cp_extra']; !empty($order['settle_params']) && $params['settle_params'] = $order['settle_params']; !empty($config['thirdparty_id']) && $params['thirdparty_id'] = $config['thirdparty_id']; $params['sign'] = self::makeSign($params); $url = self::$settleUrl; $response = Http::post($url, json_encode($params)); $result = json_decode($response, true); return $result; } /** * [querySettle 分账查询] * @param [type] $settleSn [开发者侧的订单号, 不可重复] * @return [type] [description] */ public static function querySettle($settleSn) { $config = self::$config; $params = [ 'app_id' => $config['app_id'], // 小程序 AppID 'out_settle_no' => $settleSn, // 开发者侧的分账号 // 'sign' => '', // 开发者对核心字段签名, 签名方式见文档, 防止传输过程中出现意外 // 'thirdparty_id' => '', // 服务商模式接入必传 第三方平台服务商 id,非服务商模式留空 ]; !empty($config['thirdparty_id']) && $params['thirdparty_id'] = $config['thirdparty_id']; $params['sign'] = self::makeSign($params); $url = self::$querySettleUrl; $response = Http::post($url, json_encode($params)); $result = json_decode($response, true); return $result; } /** * [notifySettle 分账回调验证] * @return [array] [返回数组格式的notify数据] */ public static function notifySettle() { $data = $_POST; // 获取回调数据 $config = self::$config; if (!$data || empty($data['status'])) die('暂无回调信息'); $result = json_decode($data['msg'], true); // 进行签名验证 // 判断签名是否正确 判断支付状态 if ($result && $data['status']!='FAIL') { return $data; } else { return false; } } /** * [addMerchant 服务商进件] * @param [type] $accessToken [授权码兑换接口调用凭证] * @param [type] $componentId [小程序第三方平台应用] * @param integer $urlType [链接类型:1-进件页面 2-账户余额页] */ public static function addMerchant($accessToken, $componentId, $urlType=1) { $params = [ 'component_access_token' => $accessToken, // 是 授权码兑换接口调用凭证 'thirdparty_component_id' => $componentId, // 是 小程序第三方平台应用 id 'url_type' => $urlType, // 是 链接类型:1-进件页面 2-账户余额页 ]; $url = self::$addMerchantUrl; $response = Http::post($url, json_encode($params)); $result = json_decode($response, true); return $result; } /** * [addSubMerchant 分账方进件] * @param [type] $thirdpartyId [小程序第三方平台应用] * @param [type] $merchantId [商户 id,用于接入方自行标识并管理进件方。由服务商自行分配管理] * @param integer $urlType [链接类型:1-进件页面 2-账户余额页] */ public static function addSubMerchant($thirdpartyId, $merchantId, $urlType=1) { $params = [ 'thirdparty_id' => $thirdpartyId, // 是 小程序第三方平台应用 id 'sub_merchant_id' => $merchantId, // 是 商户 id,用于接入方自行标识并管理进件方。由服务商自行分配管理 'url_type' => $urlType, // 是 链接类型:1-进件页面 2-账户余额页 // 'sign' => '', // 开发者对核心字段签名, 签名方式见文档, 防止传输过程中出现意外 ]; $params['sign'] = self::makeSign($params); $url = self::$addSubMerchantUrl; $response = Http::post($url, json_encode($params)); $result = json_decode($response, true); return $result; } /** * [success 通知状态] */ public static function success() { $array = ['err_no'=>0, 'err_tips'=>'success']; die(json_encode($array)); } /** * [makeSign 生成秘钥] * @param [type] $data [加密数据] * @return [type] [description] */ public static function makeSign($data) { $config = self::$config; $rList = array(); foreach($data as $k => $v) { if ($k == "other_settle_params" || $k == "app_id" || $k == "sign" || $k == "thirdparty_id") continue; $value = trim(strval($v)); $len = strlen($value); if ($len > 1 && substr($value, 0,1)=="\"" && substr($value,$len, $len-1)=="\"") $value = substr($value,1, $len-1); $value = trim($value); if ($value == "" || $value == "null") continue; array_push($rList, $value); } array_push($rList, $config['salt']); sort($rList, 2); return md5(implode('&', $rList)); } }
The above is the detailed content of Following the update trend, the guaranteed payment class of the PHP byte applet has also been updated!. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics











PHP and Python each have their own advantages, and choose according to project requirements. 1.PHP is suitable for web development, especially for rapid development and maintenance of websites. 2. Python is suitable for data science, machine learning and artificial intelligence, with concise syntax and suitable for beginners.

PHP is widely used in e-commerce, content management systems and API development. 1) E-commerce: used for shopping cart function and payment processing. 2) Content management system: used for dynamic content generation and user management. 3) API development: used for RESTful API development and API security. Through performance optimization and best practices, the efficiency and maintainability of PHP applications are improved.

PHP is a scripting language widely used on the server side, especially suitable for web development. 1.PHP can embed HTML, process HTTP requests and responses, and supports a variety of databases. 2.PHP is used to generate dynamic web content, process form data, access databases, etc., with strong community support and open source resources. 3. PHP is an interpreted language, and the execution process includes lexical analysis, grammatical analysis, compilation and execution. 4.PHP can be combined with MySQL for advanced applications such as user registration systems. 5. When debugging PHP, you can use functions such as error_reporting() and var_dump(). 6. Optimize PHP code to use caching mechanisms, optimize database queries and use built-in functions. 7

PHP and Python each have their own advantages, and the choice should be based on project requirements. 1.PHP is suitable for web development, with simple syntax and high execution efficiency. 2. Python is suitable for data science and machine learning, with concise syntax and rich libraries.

PHP is still dynamic and still occupies an important position in the field of modern programming. 1) PHP's simplicity and powerful community support make it widely used in web development; 2) Its flexibility and stability make it outstanding in handling web forms, database operations and file processing; 3) PHP is constantly evolving and optimizing, suitable for beginners and experienced developers.

PHP is suitable for web development, especially in rapid development and processing dynamic content, but is not good at data science and enterprise-level applications. Compared with Python, PHP has more advantages in web development, but is not as good as Python in the field of data science; compared with Java, PHP performs worse in enterprise-level applications, but is more flexible in web development; compared with JavaScript, PHP is more concise in back-end development, but is not as good as JavaScript in front-end development.

PHP and Python have their own advantages and disadvantages, and the choice depends on project needs and personal preferences. 1.PHP is suitable for rapid development and maintenance of large-scale web applications. 2. Python dominates the field of data science and machine learning.

PHP is mainly procedural programming, but also supports object-oriented programming (OOP); Python supports a variety of paradigms, including OOP, functional and procedural programming. PHP is suitable for web development, and Python is suitable for a variety of applications such as data analysis and machine learning.
