首页 > 编程语言 >thinkphp6调用微信商户支付-合单支付工具代码开发

thinkphp6调用微信商户支付-合单支付工具代码开发

时间:2024-09-30 10:51:16浏览次数:3  
标签:arr timestamp url 微信 合单 combine 支付 data

合单支付基本在加盟店或是分公司或是营销系统里面常见。他的出现,打破了传统提现支付或是转账支付。他的业务原理其实很简单,就是需要优先申请非普通商户,其次是每个入驻的商户都需要申请普通商户。在这之前一定要申请好对应的场景服务,比如公众号支付就需要优先申请公众号,小程序支付就需要优先申请小程序,APP支付就需要提供APP应用ID(在开放平台申请),PC网站支付就需要优先提供网站授权函,如果是企业微信支付,就需要提供企业微信。

一、支付产品流程图

二、微信支付工具集代码开发

<?php
/**
 * 微信合单支付工具
 * User: 龙哥·三年风水
 * Date: 2024/9/27
 * Time: 14:13
 */
namespace app\service;
use app\BaseError;
class WechatCooperatePayment
{
    protected $combineMchid = null;// 合单商户号
    protected $merchantSerialNumber = null;// 商户API证书序列号
    protected $combineAppid = null;// 合单商户Appid
    protected $merchantPrivateKey = null;// 商户私钥

    /**
     * 初始化参数
     * WechatPayment constructor.
     */

    public function __construct(){
        $this->combineMchid = config('pay.wechat.combine_appid');
        $this->combineAppid = config('pay.wechat.app_id');
        $this->merchantSerialNumber = config('pay.wechat.merchant_serial_number');
        $file = file_get_contents('./wechatpay/apiclient_key.pem');
        $this->merchantPrivateKey = openssl_get_privatekey($file);// 读取商户秘钥
    }

    /**
     * 合单支付
     * User: 龙哥·三年风水
     * Date: 2024/9/27
     * Time: 14:21
     * @ param $url
     * @ param $data
     * @ return mixed
     */

    public function combinePay($url,$data){
        $data['combine_mchid'] = $this->combineMchid;
        $data['combine_appid'] = $this->combineAppid;
        $authorization = $this->getSign($url,$data);
        $res = http_post($url, $authorization, $data);
        $arr = json_decode($res, true);
        if(isset($arr['code'])) {
            $error['code'] = $arr['code'];
            $error['message'] = $arr['message'];
            $error['timestamp'] = time();
            $error['ip'] = get_client_ip();
            file_put_contents('wechat_payment.txt', json_encode($error) . PHP_EOL, FILE_APPEND);
            throw new BaseError($arr['message'], 50000, 200);
        }
        return $arr;
    }

    /**
     * 获取签名
     * User: 龙哥·三年风水
     * Date: 2024/9/27
     * Time: 9:23
     * @ param $url 地址
     * @ param $data 数据
     * @ return string 返回
     */

    private function getSign($url,$data){
        $timestamp = time();
        $nonce = alnum(12).date('YmdHis', $timestamp) . rand(1000, 9999);
        $url_parts = parse_url($url);
        $canonical_url = ($url_parts['path'] . (!empty($url_parts['query']) ? "?${url_parts['query']}" : ""));
        $data = json_encode($data);
        $message = 'POST' . "\n" .
            $canonical_url . "\n" .
            $timestamp . "\n" .
            $nonce . "\n" .
            $data . "\n";
        openssl_sign($message, $signature, $this->merchantPrivateKey, "sha256WithRSAEncryption");
        $sign = base64_encode($signature);
        $schema = 'WECHATPAY2-SHA256-RSA2048';
        $token = sprintf('mchid="%s",nonce_str="%s",timestamp="%d",serial_no="%s",signature="%s"',  $this->combineMchid, $nonce, $timestamp, $this->merchantSerialNumber, $sign);
        return "Authorization: " . $schema . " " . $token;
    }

    /**
     * 销毁参数
     */

    public function __destruct(){
        $this->combineMchid = null;
        $this->combineAppid = null;
        $this->merchantSerialNumber = null;
        $this->merchantPrivateKey = null;
    }
}

三、测试JSAPI支付订单调用

public function index(){
        //定义参数
        $data['combine_out_trade_no'] = create_order();
        $data['sub_orders'] =   [
            [
                'mchid'     =>  '1230000109',
                'attach'    =>  '深圳分店',
                'amount'    =>  [
                    'total_amount'  =>  10,
                    'currency'      =>  'CNY'
                ],
                'out_trade_no'  =>  create_order(),
                'description'   =>  '运费钱'
            ]
        ];
        $data['combine_payer_info'] =   [
            'combine_payer_info'    =>  'oUpF8uMuAJO_M2pxb1Q9zNjWeS6o'
        ];
        $data['notify_url'] =   'http://www.baidu.com';
        $wechatCooperatePayment = new WechatCooperatePayment();
        $res = $wechatCooperatePayment->combinePay('https://api.mch.weixin.qq.com/v3/combine-transactions/jsapi',$data);
        var_dump($res);
}

标签:arr,timestamp,url,微信,合单,combine,支付,data
From: https://blog.csdn.net/m0_63603104/article/details/142591978

相关文章

  • 移动互联网的支付作用
     移动支付业务起源于银行的电子支付业务。银行的网上支付功能刚开始称为电子银行。网上支付涉及到很多的支付安全问题。移动支付是银行支持手机移动支付功能。移动的银行应用程序灵活程度更高,但是会增加服务器追踪客户端应用程序和相关设备联网互联的复杂程度。现在的支付业务类......
  • 在微信小程序审核过程中,有哪些常见的问题和解决方案?
    关注我,持续分享逻辑思维&管理思维&面试题;可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;推荐专栏《10天学会使用asp.net编程AI大模型》,目前已完成所有内容。一顿烧烤不到的费用,让人能紧跟时代的浪潮。从普通网站,到公众号、小程序,再到AI大模型网站。干货满满。学成后可......
  • 彩虹易支付最新版源码及安装教程(修复BUG+新增加订单投诉功能)
    该系统也没版本号,此版本目前是比较新的版本,增加了订单投诉功能,和一个好看的二次元模板。此版本是全开源版,无一处加密文件,系统默认是安装后是打不开的,本站特别修复了BUG文件,在PHP7.4环境下也没问题测试环境:Nginx1.20+PHP7.4+MySQL5.7(官方推荐配置.hp7.1+myqsl5.6)直......
  • 腾讯企业邮箱(企业微信邮箱)迁移到microsoft 365(office 365)
    1.迁移前准备(腾讯企业邮箱)1.如果你是企业管理员,首先看一下企业邮箱后台,是否已关闭登陆安全2.登录要迁移的个人邮箱后台,关闭安全登录、开启IMAP服务和相关选项,以及为邮箱设置一个密码 2.开始迁移1.登录microsoft365管理后台(https://admin.exchange.micro......
  • 亲测有效,4个微信过期或被清理文件恢复方法
    如今,无论是学习还是工作我们都离不开微信,微信的出现改变了人们的社交方式。也正是因为微信,人们之间的交流变得更加便捷与多样化。但随着交流的增加,微信的数据越来越多,手机储存空间告急,我们便会去清理,删除一些琐碎的数据。但遗憾的是,我们很难避免误删一些重要文件。或者有些......
  • PHP支付,TP5.0接入支付宝支付流程
    一、支付宝沙箱1.登录支付宝开放平台https://open.alipay.com/;点击右上角的“控制台”菜单 2.下拉到页末找到“沙盒”  配置一下基础信息:配置一下信息,特别注意,网关地址:沙箱环境是有dev的,正式上要去掉dev;二、DEMO1.下载电脑网站支付Demophp版本 2.下载后把整个文......
  • 解决:PC微信弹窗《当前客户端版本过低,请前往应用商店升级到最新版本客户端后再登录》
    目录1.背景2.利用cheatEngine直接修改内存3.利用Python代码直接修改内存1.背景虽然人类都是喜新厌旧的,但也不是什么东西都是新的好。今天换了台服务器,发现正常使用微信,弹窗提醒说版本太低了,根本不给登录。没办法啊,机器人只兼容这个版本的,只能到处找解决方案了,没......
  • 记录一个使用第三方USDT支付通道的PHP项目的开发过程及解决方案
    项目的需求背景接到一个项目,需要收付USDT,顾客要求用币安链的,即BSC链,需要实现:充值监控:当用户通过区块链钱包将USDT转账到指定地址时,系统能够监控并确认充值到账。提现功能:当用户发起提现请求时,系统能够根据用户指定的地址,自动完成USDT的转账操作。交易安全性:确保每笔交易......
  • JAVA_uniapp微信小程序获取手机号
    废话不多说封装好的代码和演示,开箱即用packagecom.ruoyi.system.util;importcom.alibaba.fastjson.JSONObject;importorg.springframework.stereotype.Service;importjava.io.BufferedReader;importjava.io.InputStreamReader;importjava.io.OutputStreamWriter;......
  • Tauri2.0+Vite5聊天室|vue3+tauri2+element-plus仿微信|tauri聊天应用
    原创tauri2.0+vue3+pinai2仿QQ/微信客户端聊天Exe程序TauriWinChat。tauri2-vue3-winchat自研vite5+tauri2.0+vue3setup+element-plus跨平台仿QQ|微信桌面端聊天软件。全新封装tauri2多开窗口管理、自定义圆角阴影窗体。实现聊天、通讯录、收藏、我的、朋友圈/小视频等模块。......