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

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

时间:2024-09-26 10:19:37浏览次数:3  
标签:arr appid url 微信 error AppApi 支付 new data

一、JSAPI支付产品、APP支付产品、小程序支付产品流程图

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

<?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;
    }
}

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

<?php
/**
 * App支付方式
 * User: 龙哥·三年风水
 * Date: 2024/9/20
 * Time: 10:55
 */
namespace Payment\WechatPay\impl;
use Payment\WechatPay\WechatPaymentHandle;
use app\BaseError;
class AppApi 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('app_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('app_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(2);
        // 选择实例
        $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(2);
        // 选择实例
        $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,微信,error,AppApi,支付,new,data
From: https://blog.csdn.net/m0_63603104/article/details/142514126

相关文章

  • 基于SpringBoot+Vue+uniapp微信小程序的小区租拼车管理信息系统的详细设计和实现
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我成功案例代码参考数据库参考源码获取前言......
  • 基于SpringBoot+Vue+uniapp微信小程序的电影院订票选座小程序的详细设计和实现
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我成功案例代码参考数据库参考源码获取前言......
  • 基于微信小程序的社区团购+ssm(lw+演示+源码+运行)
    摘要社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个会员的使用。手机具有便利性,速度快,效率高,成本低等优点。因此,构建符合自己要求的操作系统是非常有意义的。本文从管理员、商家、会员的功能要求出发,社区团购系统中......
  • 基于微信小程序的商品展示+ssm(lw+演示+源码+运行)
    商品展示系统摘要随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,微信小程序被用户普遍使用,为方便用户能够可以随时进行小程序的相应信息内容的管理,特开发了基于微信小程序的......
  • 如何正确的在项目中接入微信JS-SDK
    微信JS-SDK的功能如果你点进来,那么我相信你应该知道微信的JS-SDK可以用来做什么了。微信的官方文档描述如下。微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包。通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系统的......
  • 如何正确的在项目中接入微信JS-SDK
    微信JS-SDK的功能如果你点进来,那么我相信你应该知道微信的JS-SDK可以用来做什么了。微信的官方文档描述如下。微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包。通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系统的......
  • 基于微信小程序的小说实体书商城-计算机毕业设计源码+LW文档
    摘  要随着互联网技术和通讯技术的快速发展、成熟,两者最终结合到了一起,即移动互联网。移动互联网时代的到来,微信的普及,致使基于微信小程序的系统越来越多,因此,针对用户手机微信购买小说书籍方面的需求,特开发了本微信小程序小说实体书商城。本微信小程序小说实体书商城采用微信......
  • 微信支付开发-支付工厂H5Api查账代码
    一、H5支付产品、Native支付产品二、工厂父类抽象类代码开发<?php/***微信父类抽象类*User:龙哥·三年风水*Date:2024/9/19*Time:11:33*/namespacePayment\WechatPay;abstractclassWechatPaymentHandle{/***下单*User:龙哥·三......
  • 微信小程序开发工具最新版下载
    最近,下载微信小程序开发工具的时候,因为网络问题,发现不能够直接下载,需要使用代理才行如果你也遇到这个问题,可以通过网盘进行下载。一、官网下载下载地址:https://developers.weixin.qq.com/miniprogram/dev/devtools/stable.html二、网盘下载通过百度网盘分享的文件:微信小程序开发工......
  • 微信技术总监谈架构:微信之道——大道至简(演讲全文)
    1、前言微信——腾讯战略级产品,创造移动互联网增速记录,10个月5000万手机用户,433天之内完成用户数从零到一亿的增长过程,千万级用户同时在线,摇一摇每天次数过亿...在技术架构上,微信是如何做到的?日前,在腾讯大讲堂在中山大学校园宣讲活动上,腾讯广研助理总经理、微信技术总监周颢在两小......