首页 > 编程语言 >thinkphp6调用微信商户支付-非工厂模式代码开发

thinkphp6调用微信商户支付-非工厂模式代码开发

时间:2024-09-27 11:21:08浏览次数:10  
标签:arr code 商户 url 微信 thinkphp6 error message data

通过前面10多篇的微信支付开发-支付工厂代码开发我们发现,不管是jsapi支付、app支付、h5支付、native支付或是小程序支付,固定参数基本不变,且又是一家开发。个人建议,最实用的代码输出方式还是采用工具集封装最简单、最直接、最实用。

一、支付产品流程图

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

<?php
/**
 * 微信支付工具集
 * User: 龙哥·三年风水
 * Date: 2024/9/27
 * Time: 9:10
 */
namespace app\service;
use app\BaseError;
class WechatPayment
{
    protected $merchantId = null;// 商户号
    protected $merchantSerialNumber = null;// 商户API证书序列号
    protected $appid = null;// 公众号ID
    protected $merchantPrivateKey = null;// 商户私钥

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

    public function __construct(){
        $this->merchantId = config('pay.wechat.merchant_id');
        $this->appid = 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: 9:30
     * @ param $url
     * @ param $data
     * @ return mixed
     */

    public function pay($url,$data){
        $data['appid'] = $this->appid;
        $data['mchid'] = $this->merchantId;
        $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:33
     * @ param $url 地址
     * @ return mixed 返回
     */

    public function transac($url){
        $data['appid'] = $this->appid;
        $data['mchid'] = $this->merchantId;
        $authorization = $this->getSign($url,'');
        $res = http_gets($url, $authorization, '');
        $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:36
     * @ param $url
     * @ param $data
     * @ return mixed
     */

    public function refunds($url,$data){
        $data['appid'] = $this->appid;
        $data['mchid'] = $this->merchantId;
        $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->merchantId, $nonce, $timestamp, $this->merchantSerialNumber, $sign);
        return "Authorization: " . $schema . " " . $token;
    }

    /**
     * 销毁参数
     */

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

三、测试JSAPI支付订单调用

public function index(){
        //定义参数
        $data['description'] = '运费钱';
        $data['out_trade_no'] = create_order();
        $data['time_expire'] = date('Y-m-d\TH:i:s\+08:00',time()+3600);
        $data['notify_url'] = 'http://www.baidu.com';
        $data['amount'] = [
            'total'     =>  100,
            'currency'  =>  'CNY'
        ];
        $data['payer']  =   [
            'openid'    =>  'oUpF8uMuAJO_M2pxb1Q9zNjWeS6o'
        ];
        $wechatPayment = new WechatPayment();
        $res = $wechatPayment->pay('https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi',$data);
        var_dump($res);
}

标签:arr,code,商户,url,微信,thinkphp6,error,message,data
From: https://blog.csdn.net/m0_63603104/article/details/142586063

相关文章

  • 微信小程序授权弹框
    点击查看代码wx.getSetting({success(res){//判断已授权的scope是否含有保存到相册的授权if(!res.authSetting['scope.writePhotosAlbum']){//没有授权过,走完整的授权逻辑wx.authorize({scope:'scop......
  • 加入优质微信群,开启机遇之门
    在当今数字化的时代,社交网络的发展让人们的交流方式发生了翻天覆地的变化。微信群作为一种便捷的社交工具,已经深入到我们生活的方方面面。而优质微信群,更是如同隐藏的宝藏,为我们带来了诸多意想不到的机遇。优质微信群往往汇聚了一群有共同目标、兴趣爱好或者专业领域的人。这......
  • 使用java做一个微信机器人
    Java实现微信小号做机器人随着人工智能技术的发展,机器人在各行各业扮演着越来越重要的角色。在社交领域,微信机器人也逐渐受到人们的关注。本文将介绍如何使用Java实现一个简单的微信小号做机器人的功能。请求参数Header参数exportinterfaceApifoxModel{"X-GEWE-TOKEN":st......
  • UniApp组件与微信小程序组件对照学习
    UniApp只是一个第三方的开发工具,借鉴各种平台的能力,UniApp的组件也借鉴了微信小程序的组件,我们学习时,可以进行对照学习,我们在用UniApp开发微信小程序时,UniApp也只是将代码转成了微信小程序的代码,还是需要了解微信小程序开发,才能开发出微信小程序的。下面我们来进行对应学习1......
  • 微信小程序如何调起H5页面的支付?
    做过微信公众号支付(JSAPI)的同学,会比较熟悉,调起微信支付所需要的六个必须参数:appId、timeStamp、nonceStr、package、signType。JSAPI官方文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi_sl.php?chapter=7_7&index=6我们再来看一下小程序支付的官方介绍:https://pay.weixin.qq.co......
  • 微信小程序修改radio颜色
    看效果: 代码:<radio-group@change="onRadioChange"><label><radiovalue="同意"style="margin-right:30rpx">同意</radio></label><label><radiovalue="不同意">不同意</radio>......
  • 基于微信小程序的校园二手平台{UNIAPP+SSM+MySQL+Vue}
    目录一、前言二、技术介绍三、系统实现四、论文参考五、核心代码六、数据库文件 七、其他案例八、源码获取作者介绍:✌️大厂全栈码农|毕设实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。✌️作者博客:曾几何时......
  • 【开题报告+文档+源码】基于微信小程序的卫生院预约挂号管理系统的设计与实现
    项目背景与意义随着信息技术的迅猛发展和互联网的普及,传统医疗服务模式正面临着数字化、智能化的转型需求。特别是在医疗资源紧张、看病难、挂号难问题日益突出的背景下,借助互联网技术优化医疗服务流程,提升医疗服务效率和质量,成为当前医疗改革的重要方向之一。微信小程序作为......
  • 微信支付开发-支付工厂AppApi查账代码
    一、JSAPI支付产品、APP支付产品、小程序支付产品流程图二、工厂父类抽象类代码开发<?php/***微信父类抽象类*User:龙哥·三年风水*Date:2024/9/19*Time:11:33*/namespacePayment\WechatPay;abstractclassWechatPaymentHandle{/***下单......
  • 基于SpringBoot+Vue+uniapp微信小程序的小区租拼车管理信息系统的详细设计和实现
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我成功案例代码参考数据库参考源码获取前言......