ThinkPHP5.1开发企业微信支付到零钱

2023-11-08

Wxpay.php

<?php

//企业支付到零钱

namespace app\wechat\controller;

use think\Controller;
use think\facade\Request;

class Wxpay extends Controller {

    private $params;

    public function initialize() {
        //模拟原始数据
        $this->params = [
            'amount' => '1', //金额 单位分
            'check_name' => 'NO_CHECK', //校验用户姓名选项 NO_CHECK:不校验真实姓名 FORCE_CHECK:强校验真实姓名
            'desc' => 'tx', //付款描述
            'mch_appid' => config('wechat.appid'), //APPid,
            'mchid' => config('wechat.mchid'), //商户号,
            'nonce_str' => md5(time()), //随机字符串
            'openid' => getOpenId(), //用户openid
            'partner_trade_no' => date('YmdHis'), //商户订单号
            'spbill_create_ip' => Request::ip(), //调用接口机器的ip地址 
        ];
    }

    public function index() {
        $res = $this->sign();
        $dat = ArrToXml($res);
        $xml = iconv('UTF-8', 'ISO8859-1', $dat);
        $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';
        $returnXml = postData($url, $xml);
        $returnArr = XmlToArr($returnXml);
        dump($returnArr);
    }

    public function sign() {
        return $this->setSign($this->params);
    }

    /**
     * 获取签名 
     * @param array $arr
     * @return string
     */
    public function getSign($arr) {
        //去除空值
        $arrfilter = array_filter($arr);
        if (isset($arrfilter['sign'])) {
            unset($arrfilter['sign']);
        }
        //按照键名字典排序
        ksort($arrfilter);
        //生成url格式的字符串
        $str = $this->arrToUrl($arr) . '&key=' . config('wechat.key');
        // echo $str;die;
        return strtoupper(md5($str));
    }

    /**
     * 获取带签名的数组 
     * @param array $arr
     * @return array
     */
    public function setSign($arr) {
        $arr['sign'] = $this->getSign($arr);
        return $arr;
    }

    /**
     * 数组转URL格式的字符串
     * @param array $arr
     * @return string
     */
    public function arrToUrl($arr) {
        return urldecode(http_build_query($arr));
    }

}

公共方法:common.php

//数组转xml
function ArrToXml($arr) {
    if (!is_array($arr) || count($arr) == 0) {
        return '';
    }
    $xml = "<xml>";
    foreach ($arr as $key => $val) {
        $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
    }
    $xml .= "</xml>";
    return $xml;
}

//Xml转数组
function XmlToArr($xml) {
    if ($xml == '') {
        return '';
    }
    libxml_disable_entity_loader(true);
    $arr = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
    return $arr;
}

//CURL携带ssl证书和秘钥
function postData($url, $postfields) {

    $ch = curl_init();
    $params[CURLOPT_URL] = $url;    //请求url地址
    $params[CURLOPT_HEADER] = false; //是否返回响应头信息
    $params[CURLOPT_RETURNTRANSFER] = true; //是否将结果返回
    $params[CURLOPT_FOLLOWLOCATION] = true; //是否重定向
    $params[CURLOPT_POST] = true;
    $params[CURLOPT_POSTFIELDS] = $postfields;
    $params[CURLOPT_SSL_VERIFYPEER] = false;
    $params[CURLOPT_SSL_VERIFYHOST] = false;
    //以下是证书相关代码
    $params[CURLOPT_SSLCERTTYPE] = 'PEM';
    $params[CURLOPT_SSLCERT] = 'apiclient_cert.pem';  
    $params[CURLOPT_SSLKEYTYPE] = 'PEM';
    $params[CURLOPT_SSLKEY] = 'apiclient_key.pem';  

    curl_setopt_array($ch, $params); //传入curl参数
    $content = curl_exec($ch); //执行
    curl_close($ch); //关闭连接
    return $content;
}

//获取用户OpenId
function getOpenId() {
    $openid = Cache::get('openid');
    if ($openid) {
        return $openid;
    } else {
        //1.用户访问一个地址 先获取到code
        if (Request::get('code') == null) {
            //构建回调地址为当前地址
            $redurl = Request::server('REQUEST_SCHEME') . '://' . Request::server('HTTP_HOST') . Request::server('REQUEST_URI');
            $reurl = urlEncode($redurl);
            $url = 'https://open.weixin.qq.com/connect/oauth2/authorize?' . "appid=" . config('wechat.appid') . "&redirect_uri=" . $reurl . "&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";
            //响应跳转请求
            header("location:{$url}");
            exit;
        } else {
            //2.根据code获取到openid
            //调用接口获取openid
            $openidurl = 'https://api.weixin.qq.com/sns/oauth2/access_token?' . "appid=" . config('wechat.appid') . "&secret=" . config('wechat.secret') . "&code=" . Request::get('code') . "&grant_type=authorization_code";
            $data = curl_request($openidurl);
            $arr = json_decode($data, true);
            Cache::set('openid', $arr['openid']);
            return $arr['openid'];
        }
    }
}

配置文件:wechat.php

<?php

return [
    'key' => '',
    'mchid' => '',
    'appid' => '',
    'secret' => '',
];

微信公众平台支付接口调试工具

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ThinkPHP5.1开发企业微信支付到零钱 的相关文章

  • ThinkPHP 鲜为人知的 selectAdd 方法 addAll( select() )

    TP算是国内相当热门的一个PHP框架 xff0c 相信大家对TP的普通增删查改所用的select add save delect find getField 等等内置函数早已烂熟于心了 今天 xff0c 就向大家介绍一种TP手册中未提及 x
  • ThinkPHP中的create方法与自动令牌验证

    转载自 xff1a Thinkphp中Create方法深入探究 ThinkPHP中的create方法与自动令牌验证实例教程 Thinkphp中Create方法深入探究 由于工作原因在thinkPHP的create 方法上遇到了问题 xff0
  • thinkphp框架图书馆管理系统代码_??thinkphp中 select()和find()方法详解

    thinkphp是比较好的php开发框架 xff0c 能比较快速的开发MVC架构的管理系统 xff0c 我们需要用到 select 和find 方法 xff0c 两个方法都能返回数据集数组 xff0c 但有什么不同呢 xff1f 先看一下我
  • ThinkPHP URL路由解析

    ThinkPHP是国内非常火的一个轻量级框架 xff0c 采用MVC模式 xff0c 结构写的非常好 xff0c 今天 大象 带大家走一下ThinkPHP框架系统运行流程 xff0c 我将跟随ThinkPHP的执行进行代码讲解 xff0c
  • thinkphp页面请求时间超过40S报404错误解决办法

    最近在写一个thinkphp项目的时候 xff0c 发现Ajax从后端请求数据时间比较长 xff0c 大概需要45秒左右 xff0c 但是一旦请求时间超过40s xff0c 页面就会超时404了 xff0c 一开始以为是ajax请求时间不能
  • thinkphp根据时间戳查询时间范围内的记录

    这是获取当月月初和月末的时间戳 beginThismonth 61 mktime 0 0 0 date 39 m 39 1 date 39 Y 39 endThismonth 61 mktime 23 59 59 date 39 m 39
  • thinkphp中display调用模板文件详…

    模板变量赋值后就需要调用模板文件来输出相关的变量 xff0c 模板调用通过display方法来实现 我们在操作方法的最后使用 xff1a this gt display 就可以输出模板 xff0c 根据前面的模板定义规则 xff0c 因为系
  • 微信公众号配置token

    1 在微信公众平台开发 基本设置页面 点击 修改配置 按钮 填写服务器地址 URL Token和EncodingAESKey token可以任意填写 对应验证的token URL对应是可以访问到 验证token的方法 的链接 2 代码中进行
  • 测试php中接收call_user_func_array抛出的异常

    1 首先新建一个mytest数据表 表引擎注意使用的innodb CREATE TABLE mytest id int 11 NOT NULL AUTO INCREMENT name varchar 30 NOT NULL DEFAULT
  • Thinkphp6.0框架远程调试配置

    首先需要安装think socketlog扩展 composer require topthink think socketlog 只需要在log php配置文件中加入如下配置 默认日志记录通道 记得在env中配置参数 default gt
  • thinkphp 中 使用七牛云上传(来自thinkphp官网)

    利用七牛云私有空间存储文件 第一步 注册七牛云 创建空间 将空间设为私有 需要记下的东西 AK SK bucket 第二步配置ThinkPHP 在config php添加 UPLOAD SITEIMG QINIU gt array maxS
  • tp5中树状图数据格式的返回

    1 条件 数据库中的数据必须是无限递归数据 2 数据处理 public function treeListApi list this gt db class gt field id name parent id gt where is de
  • FastAdmin的一个小BUG,无法正常识别驼峰命名法的控制器名

    FastAdmin中内置了权限管理模块 在应用的过程中 控制器名经常会是两个单词 比如NotifyMessage 这是控制器名 在设置权限时 我们需要写成 notify message 可是这样设置后 会提示没有权限 而写成notifyme
  • ThinkPHP5.1开发企业微信支付到零钱

    Wxpay php
  • ThinkPHP3.2自带的七牛云配置使用

    利用七牛云私有空间存储文件 第一步 注册七牛云 创建空间 将空间设为私有 需要记下的东西 accessKey secrectKey domain bucket 第二步配置ThinkPHP 在config php添加 UPLOAD SITEI
  • linux下部署thinkphp5项目

    准备工作 购买一个linux服务器地址 安装好linux常用的ssh工具 我这边喜欢用xshell敲命令 用filezilla传输文件 这些工具只要到官网下载就好 速度很快的 1 安装phpstudy for linux 安装下载phpst
  • PHP基础巩固【PHP导入导出EXCEl,TP实用封装函数,可定义表格样式】

    这个方法是自己封装了 方法确实也好用 自己也用了好几年了 但是最近发现好多小年轻用到都是PhpOffice 咱也应该与时俱进 就先把这方法分享出来 等熟悉下phpoffice再贴出更新后的版本 把以下代码写入公共函数 导入EXCEL par
  • ThinkPHP5多语言切换项目实战

    ThinkPHP5多语言切换实战 1 在配置文件中开启多语言配置 2 然后添加多语言目录 这里创建你需要的语言包 在语言包里定义需要翻译的文本 中英文数组的键名写成一致 然后在html文件里输入 lang 键名 对应的键名 就是下图的写法
  • TP5使用predis

    1 安装 composer require predis predis 2 使用 use use Predis Client class Index 使用predis public function index 配置连接的IP 端口 以及相
  • thinkphp5.0 常量

    预定义常量 EXT 类库文件后缀 php THINK VERSION 框架版本号 路径常量 DS 当前系统的目录分隔符 THINK PATH 框架系统目录 D phpStudy WWW my tadmin thinkphp ROOT PAT

随机推荐

  • pycharm安装教程

    pycharm是一款功能强大的python编辑器 具有跨平台性 鉴于目前最新版pycharm使用教程较少 为了节约大家摸索此IDE的时间 来介绍一下pycharm在windows下是如何安装的 这是PyCharm的下载地址 http www
  • Java验证码图片生成源代码

    Java验证码图片生成源代码 import javax imageio ImageIO import java awt import java awt image BufferedImage import java io import ja
  • 查询统计Ceph上的pg 总数

    本文中的命令的第一版来源于国外的一个博客 后面的版本为我自己修改的版本 查询的命令如下 ceph pg dump awk pg stat col 1 while col up col col 0 9a f 0 9a f match 0 0
  • 图片码生成

    1 项目结构 2 类的内容 2 1 Digest package com rtsm zhjs background common imgcode author loki date 2018 04 27 上午10 16 import org
  • 一篇文章带你了解国际化,以及springboot当中如何实现国际化

    国际化一般在中大型公司领域会用得到 有时候会面对一些外国客户等 这时候就需要做一些多语言功能 来提升项目的可读性 本文带你了解什么是国际化以及他的用法 目录 理解国际化概念 简单了解国际化原理 国际化demo练习 1 引入依赖 2 创建多语
  • C#6.0新语法

    一 自动属性初始化 在以前的C 版本中 属性是这样写的 1 public int Id get set 2 public string Name get set 在C 6 0中 属性可以自动赋初始值 例如 1 public string N
  • freeRTOS手册 第六章 . 中断管理

    如果我对本翻译内容享有所有权 允许任何人复制使用本文章 不会收取任何费用 如有平台向你收取费用与本人无任何关系 第六章 中断管理 章节介绍和范围 事件 嵌入式实时系统必需对环境中的事件做出响应 比如 外部网络设备收到一个发送给TCP IP栈
  • gc垃圾回收四种方法

    标记清除算法 标记清除 Mark Sweep 算法 包含 标记 和 清除 两个阶段 首先标记出所有需要回收的对象 在标记完成后统一回收掉所有被标记的对象 标记清除算法是最基础的收集算法 后续的收集算法都是基于该思路并对其缺点进行改进而得到的
  • 使用Docker-镜像命令

    镜像名称 首先来看下镜像的名称组成 镜名称一般分两部分组成 repository tag 在没有指定tag时 默认是latest 代表最新版本的镜像 如图 这里的mysql就是repository 5 7就是tag 合一起就是镜像名称 代表
  • C#--使用Process类kill进程

    1 背景 static变量 static变量也称作静态变量 静态变量和非静态变量的区别是 静态变量被所有的对象所共享 在内存中只有一个副本 它当且仅当在类初次加载时会被初始化 而非静态变量是对象所拥有的 在创建对象的时候被初始化 存在多个副
  • 使用 Qt designer

    使用 Qt designer 1 配置Qt designer外部工具 2 Qt designer Qt 设计师 使用 2 1 创建保存文件ui 2 2 pyuic5 exe 工具 转化成为py文件 2 3 直接导入UI文件 2 qrc资源管
  • C# 正则表达式进阶

    文章目录 限定开头和结尾 匹配汉字 1 9反向引用 分组构造 具名的分组构造 断言 零宽度正预测先行断言 断言某位置后面是xxx 零宽度负预测先行断言 断言某位置后面不是xxx 零宽度正预测后发断言 断言某位置前面是xxx 零宽度负预测后发
  • 第二十七篇 SeNet——论文翻译

    文章目录 摘要 1 简介 2 相关工作 3 压缩和激励块 3 1 压缩 全局信息嵌入 3 2激励 自适应再校正 3 3 实例化 4 模型和计算复杂性 5 实验 5 1 图像分类 5 2 场景分类 5 3 COCO上的目标检测 5 4 ILS
  • 保研之路——复旦计算机学院预推免

    复旦计算机学院预推免 个人情况 高校复试参与情况 复旦计算机学院直硕 9 19 9 20 结语 嗯 抱着不白花这么多路费住宿费的初衷准备写一个保研经验贴 希望学弟学妹少花点钱吧orz 我的战术大概是只要学校给我发了邀请我就去 除了时间冲突的
  • windows配置selenium

    文章目录 1 确定chrome版本 2 下载并配置chrome驱动 3 测试 1 确定chrome版本 在chrome中访问 chrome settings help 可以看到当前版本 111 0 5563 111 64位 2 下载并配置c
  • matlab读取sheet1_matlab读取excel数据的方法步骤详解

    在Excel中录入好数据以后经常需要被matlab读取 具体该如何读取呢 下面是由学习啦小编分享的matlab读取excel数据的方法 以供大家阅读和学习 matlab读取excel数据的方法 matlab读取Excel数据步骤1 如果数据
  • Vue/JS自定义指令:实现元素滑动、移动端适配以及边界处理

    核心属性 Element clientWidth 元素可视宽度 Element clientHeight 元素可视高度 MouseEvent clientX 鼠标相对于浏览器左上顶点的水平坐标 MouseEvent clientY 鼠标相对
  • 微服务如何治理

    微服务远程调用可能有如下问题 注册中心宕机 服务提供者B有节点宕机 服务消费者A和注册中心之间的网络不通 服务提供者B和注册中心之间的网络不通 服务消费者A和服务提供者B之间的网络不通 服务提供者B有些节点性能变慢 服务提供者B短时间内出现
  • 每日学习07:Comparable接口的CompareTo的用法

    接口 Comparable 此接口强行对实现它的每个类的对象进行整体排序 这种排序被称为类的自然排序 类的 compareTo 方法被称为它的自然比较方法 字符串 数组列表 数组 所有可以 排序 的类都实现了java lang Compar
  • ThinkPHP5.1开发企业微信支付到零钱

    Wxpay php