首页 > 其他分享 >微信支付开发-支付工厂H5Api查账代码

微信支付开发-支付工厂H5Api查账代码

时间:2024-09-25 15:55:06浏览次数:3  
标签:arr appid url 微信 H5Api error 支付 new data

一、H5支付产品、Native支付产品

二、工厂父类抽象类代码开发

<?php
/**
 * 微信父类抽象类
 * User: 龙哥·三年风水
 * Date: 2024/9/19
 * Time: 11:33
 */
namespace Payment\WechatPay;
abstract class WechatPaymentHandle
{
    /**
     * 下单
     * User: 龙哥·三年风水
     * Date: 2024/9/19
     * Time: 11:36
     * @ return mixed
     */
    protected abstract function pay();

    /**
     * 查询
     * User: 龙哥·三年风水
     * Date: 2024/9/19
     * Time: 11:39
     * @ return mixed
     */
    protected abstract function transac();

    /**
     * 退款
     * User: 龙哥·三年风水
     * Date: 2024/9/19
     * Time: 11:42
     * @ return mixed
     */
    protected abstract function refunds();
}

三、工厂通道选择类代码开发

<?php
/**
 * 微信支付工厂通道选择类
 * User: 龙哥·三年风水
 * Date: 2024/9/19
 * Time: 11:47
 */
namespace Payment\WechatPay;
use app\BaseError;
use Payment\WechatPay\impl\AppApi;
use Payment\WechatPay\impl\Applet;
use Payment\WechatPay\impl\H5Api;
use Payment\WechatPay\impl\JsApi;
use Payment\WechatPay\impl\NativeApi;

class WechatPaymentFactory
{
    protected static $instance = null;//缓存实例
    protected $merchantId = null;// 商户号
    protected $merchantSerialNumber = null;// 商户API证书序列号
    protected $appid = null;// 公众号ID
    protected $merchantPrivateKey = null;// 商户私钥
    protected $channelType = 0;//通道类型

    /**
     * 初始化资源
     */

    public function __construct($type){
        $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);// 读取商户秘钥
        self::$instance = null;
        $this->channelType = $type;
    }


    /**
     * 通道选择
     * User: 龙哥·三年风水
     * Date: 2024/9/19
     * Time: 14:34
     * @ param $url
     * @ param $data
     * @ return null|JsApi
     */

    public function sendWechatPaymentHandle($url,$data){
        switch ((int)$this->channelType){
            case 1:
                $data['appid'] = $this->appid;
                $data['mchid'] = $this->merchantId;
                $authorization = $this->getSign($url,$data);
                self::$instance = new JsApi($url,$authorization,$data);
                break;
            case 2:
                $data['appid'] = $this->appid;
                $data['mchid'] = $this->merchantId;
                $authorization = $this->getSign($url,$data);
                self::$instance = new AppApi($url,$authorization,$data);
                break;
            case 3:
                $data['appid'] = $this->appid;
                $data['mchid'] = $this->merchantId;
                $authorization = $this->getSign($url,$data);
                self::$instance = new H5Api($url,$authorization,$data);
                break;
            case 4:
                $data['appid'] = $this->appid;
                $data['mchid'] = $this->merchantId;
                $authorization = $this->getSign($url,$data);
                self::$instance = new NativeApi($url,$authorization,$data);
                break;
            case 5:
                $data['appid'] = $this->appid;
                $data['mchid'] = $this->merchantId;
                $authorization = $this->getSign($url,$data);
                self::$instance = new Applet($url,$authorization,$data);
                break;
            default:
                self::$instance = null;
                throw new BaseError("未设置任何通道",50000,200);
                break;
        }
        return self::$instance;
    }

    /**
     * 生成签名
     * User: 龙哥·三年风水
     * Date: 2024/9/19
     * Time: 14:01
     * @ param $url
     * @ param $data
     * @ return string
     */

    protected 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;
        self::$instance = null;
    }
}

四、H5Api支付产品查账代码开发

<?php
/**
 * H5支付方式
 * User: 龙哥·三年风水
 * Date: 2024/9/20
 * Time: 11:29
 */
namespace Payment\WechatPay\impl;
use Payment\WechatPay\WechatPaymentHandle;
use app\BaseError;
class H5Api extends WechatPaymentHandle
{
    protected $url = ''; //访问路径
    protected $header = ''; //头文件
    protected $data = []; //数据组

    /**
     * 初始化
     * @ param $url
     * @ param $header
     * @ param $data
     */

    public function __construct($url,$header,$data){
        $this->url = $url;
        $this->header = $header;
        $this->data = $data;
    }

    /**
     * 下单
     * User: 龙哥·三年风水
     * Date: 2024/9/19
     * Time: 11:36
     * @ return mixed
     */
    public function pay()
    {
        $res = http_post($this->url, $this->header, $this->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('h5_pay.txt', json_encode($error) . PHP_EOL, FILE_APPEND);
            throw new BaseError($arr['message'], 50000, 200);
        }
        return $arr;
    }

    /**
     * 查询
     * User: 龙哥·三年风水
     * Date: 2024/9/19
     * Time: 11:39
     * @ return mixed
     */
    public function transac()
    {
        $res = http_gets($this->url, $this->header);
        $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('js_pay.txt', json_encode($error) . PHP_EOL, FILE_APPEND);
            throw new BaseError($arr['message'], 50000, 200);
        }
        return $arr;
    }

    /**
     * 退款
     * User: 龙哥·三年风水
     * Date: 2024/9/19
     * Time: 11:42
     * @ return mixed
     */
    public function refunds()
    {
        $res = http_post($this->url, $this->header, $this->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('h5_pay.txt', json_encode($error) . PHP_EOL, FILE_APPEND);
            throw new BaseError($arr['message'], 50000, 200);
        }
        return $arr;
    }

    /**
     *
     */

    public function __destruct(){
        $this->url = '';
        $this->header = '';
        $this->data = [];
    }
}

五、微信支付订单号查询订单测试调用

public function index(){
        //定义参数
        $transaction_id = '支付时返回微信订单号';
        // 初始化通道
        $wechatPaymentFactory = new WechatPaymentFactory(3);
        // 选择实例
        $wechatPaymentHandle = $wechatPaymentFactory->sendWechatPaymentHandle("https://api.mch.weixin.qq.com/v3/pay/transactions/id/{$transaction_id}",'');
        $res = $wechatPaymentHandle->pay();
        var_dump($res);
}

六、商户订单号查询订单测试调用

public function index(){
        //定义参数
        $out_trade_no = '支付时系统创建的支付单号';
        // 初始化通道
        $wechatPaymentFactory = new WechatPaymentFactory(3);
        // 选择实例
        $wechatPaymentHandle = $wechatPaymentFactory->sendWechatPaymentHandle("https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/{$out_trade_no}",'');
        $res = $wechatPaymentHandle->pay();
        var_dump($res);
}

标签:arr,appid,url,微信,H5Api,error,支付,new,data
From: https://blog.csdn.net/m0_63603104/article/details/142514411

相关文章

  • 微信小程序开发工具最新版下载
    最近,下载微信小程序开发工具的时候,因为网络问题,发现不能够直接下载,需要使用代理才行如果你也遇到这个问题,可以通过网盘进行下载。一、官网下载下载地址:https://developers.weixin.qq.com/miniprogram/dev/devtools/stable.html二、网盘下载通过百度网盘分享的文件:微信小程序开发工......
  • 微信技术总监谈架构:微信之道——大道至简(演讲全文)
    1、前言微信——腾讯战略级产品,创造移动互联网增速记录,10个月5000万手机用户,433天之内完成用户数从零到一亿的增长过程,千万级用户同时在线,摇一摇每天次数过亿...在技术架构上,微信是如何做到的?日前,在腾讯大讲堂在中山大学校园宣讲活动上,腾讯广研助理总经理、微信技术总监周颢在两小......
  • uniapp精仿支付宝UI界面,首页/理财/消息/生活/口碑/我的,还有模拟支付宝扫码支付/收付款
    uniapp精仿支付宝UI界面,首页/理财/消息/生活/口碑/我的,还有模拟支付宝扫码支付/收付款等功能,界面漂亮颜值高,视频商城小工具等,蚂蚁森林种树养鸡农场偷菜样样齐用于视频,商城,直播,聊天等sumer-alipay介绍uniapp精仿支付宝UI界面,首页/理财/消息/生活/口碑/我的,还有模拟支付宝......
  • uniapp精仿微信源码,基于SumerUI和Uniapp前端框架的一款仿微信APP应用,界面漂亮颜值高,视
    uniapp精仿微信源码,基于SumerUI和Uniapp前端框架的一款仿微信APP应用,界面漂亮颜值高,视频商城小工具等,朋友圈视频号即时聊天用于视频,商城,直播,聊天,等等场景,源码分享sumer-weixin介绍uniapp精仿微信,基于SumerUI3.0和Uniapp前端框架的一款仿微信APP应用,界面漂亮颜值高,视频......
  • 企业支付宝账户号委托代扣开通步骤?支付宝预授权开通步骤?
    开通企业支付宝账户号委托代扣的步骤通常包括以下几个阶段:(需要开通辅助联系小编)准入条件:确保你的账户类型为支付宝企业账号,并且准备好相关的营业执照和其他必要材料 。签约流程:登录支付宝开放平台,搜索“支付宝预授权”并选择开通服务。根据提示填写相关信息并提交申请 。技......
  • uni-app开发微信小程序时,有哪些性能优化的技巧
    大家好,我是威哥,在使用uni-app开发微信小程序时,性能优化是提升用户体验的关键。今天的内容,整理了以下13个有效的性能优化技巧,供你在开发中参考:1.减少页面层级和组件嵌套:减少页面层级和组件嵌套是前端性能优化中的常见做法,它有助于减少浏览器的渲染负担,提高页面的响应速度。我们通过......
  • 使用python创建一个微信聊天机器人
    使用python创建一个微信聊天机器人实现的功能如下笑话天气歇后语历史上的今天核心代码:#-*-coding:utf-8-*-fromrandomimportrandintimportitchatimportreimportrequestsemojis_love=["❤️","......
  • 基于微信小程序的文章管理系统设计与实现-计算机毕业设计源码+LW文档
    摘要随着计算机技术的成熟,互联网的建立,如今,PC平台上有许多关于文章管理方面的应用程序,但由于使用时间和地点上的限制,用户在使用上存在着种种不方便,而开发一款基于微信小程序的文章管理系统,能够有效地解决这个问题。本基于微信小程序的文章管理系统是针对文章管理而开发,采用微信......
  • python+flask计算机毕业设计基于微信小程序的法律问题咨询系统设计与实现(程序+开题+论
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网的飞速发展和智能手机的普及,人们获取信息和解决问题的途径日益多样化。在法律服务领域,传统的线下咨询方式已难以满足公众日益增......
  • python+flask计算机毕业设计基于微信小程序的河南省美食分享平台(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在移动互联网时代,智能手机和社交媒体已成为人们日常生活不可或缺的一部分。微信小程序作为腾讯推出的一种轻量级应用形态,凭借其无需安装、......