版本更新记录

v1.0.1(2020年7月25)


  • 完成基本常用的API支持

使用说明

SW-X的官方扩展包都必须统一放置在/extend/扩展目录下。
每个扩展包的版本迭代都只针对大版本做独立更新,例如:v1.2.x只会有一个Wechat v1.2的官方版本。

扩展包的API接口地址,统一存放再Sdk.php文件中,接口文件独立存放在Wechat/vendor/目录下,单个文件为同类接口封装,接口实体类都必须统一继承Basics基类。

下载SDK

修改配置

扩展包的配置存放在/Wechat/Sdk.php文件中,初始化的配置项可以打开该文件进行修改。
支持以下配置项:

[
    // 消息加解密方式 1【明文模式】 2【兼容模式,安全模式】
    'token_type' => 1,
    // TOKEN
    'token' => '',
    // EncodingAESKey
    'EncodingAESKey' => '', 
    // appid
    'appid' => '',
    // AppSecret
    'appsecret' => '',
    // access_token有效期(S)
    'access_token_outtime' => 180,
    // 用户信息返回结果语言版本 zh_CN 简体,zh_TW 繁体,en 英语
    'web_lang' => 'zh_CN',
    // 商户ID
    'mch_id' => '',
    // 支付key
    'pay_key' => '',
    // 小程序的APPID
    'applets_appid' => '',
]

注入配置

扩展包除了直接修改初始化配置外,还支持动态注入配置,方便应用切换不同的公众号实体。调用Sdk.phpsetConfig()方法,可以传入上面的配置项进行合并覆盖。
示例:

<?php
$wx = new \Wechat\Sdk();
$ret = $wx->setConfig([
    'token_type' => 2, // 消息加解密方式 1【明文模式】 2【兼容模式,安全模式】
])->调用API();

统一判断错误

扩展包若API调用失败,则统一返回false,成本则返回微信接口return的结果集,但会先转成array再返回。

获取错误内容

实际开发中若要查看API的失败详情,可以调用Sdk.phpget_error()方法,该方法返回微信接口return的结果集,也是转了array的。

获取SDK版本号

实际开发中,可以调用Sdk.phpversion()方法,查看当前SDK的版本号,以方便查看当前SDK支持哪些接口调用。

Token校验

该接口用于校验微信公众号【基本配置】->【服务器配置】的消息通知地址。
调用方法如下:

<?php
$wx = new \Wechat\Sdk();
$wx->check_token();

注意:该接口没有返回值,也无须调用控制器的fetch()方法,因为接口自动调用了请求的end方法,向微信返回了echoStr

消息自动回复

鉴于微信消息自动回复在日常操作中比较复杂,所以API中就对操作流程没有做太多的封装,只是将取包跟推包两个操作,做了处理。
使用message_reply()->xml()接收数据包
使用message_reply()->send()返回数据包给微信
完整示例如下:

<?php
$wx = new \Wechat\Sdk();
// 抓取消息,并自动解密
$xml = $wx->message_reply()->xml();
# FromUserName : 发送方帐号(一个OpenID)
$fromUsername = $xml->FromUserName;
# toUsername   : 开发者微信号
$toUsername = $xml->ToUserName;
# keyword      : 发送过来的内容
$keyword = trim($xml->Content);
# 服务器时间戳
$time = time();

# 这里的XML格式不能改变,是微信规定的格式,里面的参数使用[%s]占位符占用,到时候填充完成,再发送回给微信
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>0</FuncFlag>
</xml>"; 

# 如果发送过来的内容不给控            
if(!empty( $keyword )){
    # 返回给微信的字符串类型
    $msgType = "text";
    # 要返回给微信显示的内容
    $contentStr = "SW-X Hello word!";
    if ($keyword == '小黄牛') {
        $contentStr = "真帅~~";
    }
    // 替换占位符
    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
    // 回复消息,并自动加密
    $wx->message_reply()->send($resultStr);
}

注意:该接口没有返回值,也无须调用控制器的fetch()方法,因为接口自动调用了请求的end方法,向微信返回了echoStr

长链接转换

该接口返回值为微信官方的return参数:

<?php
$wx = new \Wechat\Sdk();
// 长连接转短链接
return $this->fetch(dd($wx->short_url('https://www.sw-x.cn')));

生成二维码

该接口返回值微信官方支持的二维码URL地址,支持传递2个参数:
$param-1:二维码参数
$param-2:二维码的类型 1|2|3 = 临时|永久|永久的字符串参数值

<?php
$wx = new \Wechat\Sdk();
// 生成二维码
return $this->fetch(dd($wx->qrcode('https://www.sw-x.cn')));

获取access_token

该接口为内置API,用于普通微信API接口调用,若需要自行扩展API支持,可以使用该接口获取access_token。
该接口的返回值,为access_token字符串,并不是官方return的参数。

<?php
$wx = new \Wechat\Sdk();
return $this->fetch($wx->access_token());

查询菜单

该接口返回值为微信官方的return参数:

<?php
$wx = new \Wechat\Sdk();
// 查询当前菜单的JSON
$menu = $wx->menu()->query();
return $this->fetch(dd($menu));

清空菜单

该接口返回值为微信官方的return参数:

<?php
$wx = new \Wechat\Sdk();
// 删除当前菜单
$array = $wx->menu()->delete();
return $this->fetch(dd($array));

更新菜单

该接口返回值为微信官方的return参数:

<?php
$wx = new \Wechat\Sdk();
// 更新菜单
$array = $wx->menu()->create('{"button":[{"type":"click","name":"🍅点我咨询","key":"GET_ZIXUN","sub_button":[]},{"type":"view","name":"👉方案定制","url":"http:\/\/www.sw-x.cn","sub_button":[]},{"type":"view","name":"👉风险评估","url":"http:\/\/www.sw-x.cn","sub_button":[]}]}');
return $this->fetch(dd($array));

注意:create方法传递的菜单内容,需要自己转换成json再传入。

设置行业信息

该接口返回值为微信官方的return参数:

<?php
$wx = new \Wechat\Sdk();
// 设置行业信息
$array = $wx->template()->api_set_industry([
    "industry_id1" => "2",
    "industry_id2" => "1"
]);
return $this->fetch(dd($array));

获取设置的行业信息

该接口返回值为微信官方的return参数:

<?php
$wx = new \Wechat\Sdk();
// 获取设置的行业信息
$array = $wx->template()->get_industry();
return $this->fetch(dd($array));

获取模板ID

该接口返回值为微信官方的return参数:

<?php
$wx = new \Wechat\Sdk();
// 获取模板ID
$array = $wx->template()->api_add_template([
    "template_id_short" => "TM00303"
]);
return $this->fetch(dd($array));

获取模板列表

该接口返回值为微信官方的return参数:

<?php
$wx = new \Wechat\Sdk();
// 获取模板列表
$array = $wx->template()->get_all_private_template();
return $this->fetch(dd($array));

删除模板

该接口返回值为微信官方的return参数:

<?php
$wx = new \Wechat\Sdk();
// 删除模板
$array = $wx->template()->del_private_template([
    "template_id" => "tYNamoJ58Xv5KTMorZYa1xpVdg8mnytSO-iwiP0MdCk"
]);
return $this->fetch(dd($array));

发送消息模板

该接口返回值为微信官方的return参数:

<?php
$wx = new \Wechat\Sdk();
// 发送消息模板
$array = $wx->template()->send([
    "touser" => "oOz-EuBWers5uTrV3vt0l0-E40Wo",
    "template_id" => "APszFGu_A-S0-FAsiyn26HAaq6vpCrQ8oSmYDYZf-h0",
    "url" => "http://weixin.qq.com/download",        
    "data" => [
        "first" => [
            "value" => "恭喜你购买成功!",
            "color" => "#173177"
        ],
        "delivername" => [
            "value" => "巧克力",
            "color" => "#173177"
        ],
        "ordername" => [
            "value" => "39.8元",
            "color" => "#173177"
        ],
        "remark" => [
            "value" => "欢迎再次购买!",
            "color" => "#173177"
        ]
    ]
]);
return $this->fetch(dd($array));

获取用户列表

该接口可传入一个参数open_id,默认为null,表示默认从第一个用户开始拉取
返回值为微信官方的return参数:

<?php
$wx = new \Wechat\Sdk();
// 获取用户列表
$array = $wx->union()->get_user_list();
return $this->fetch(dd($array));

设置用户的备注名

该接口返回值为微信官方的return值,支持传递2个参数:
$param-1:用户的OpenId
$param-2:需要设置的备注名

<?php
$wx = new \Wechat\Sdk();
// 设置用户的备注名
$array = $wx->union()->remark('oOz-EuBWers5uTrV3vt0l0-E40Wo', '测试备注名');
return $this->fetch(dd($array));

生成授权登录地址

该接口的返回值,是最终用于$this->redirect()URL,该接口支持传递3个参数:
$param-1:授权后重定向的回跳地址
$param-2:授权方式,支持传入baseuserinfo,默认base
$param-3:自定义的参数,具体参考微信开发手册,默认1

<?php
$wx = new \Wechat\Sdk();
// 生成授权登录地址
$url = $wx->union()->login('https://www.sw-x.cn', 'base');
return $this->fetch(dd($url));

使用code获取Token

该接口返回值为微信官方的return值,支持传递1个参数:
$param-1:授权后回调的CODE值,默认为null,当为null时,API内部会自动调用get获取当前请求中的code

<?php
$wx = new \Wechat\Sdk();
// 使用code去获取Token
$array = $wx->union()->token();
return $this->fetch(dd($array));

使用Token获取用户信息

该接口返回值为微信官方的return值,支持传递2个参数:
$param-1:使用CODE获取到的Token值
$param-2:用户的OpenId

<?php
$wx = new \Wechat\Sdk();
// 使用Token去获取用户信息
$array = $wx->union()->userinfo('TOKEN参数', 'oOz-EuBWers5uTrV3vt0l0-E40Wo');
return $this->fetch(dd($array));

主动更新Token

该接口返回值为微信官方的return值,支持传递1个参数:
$param-1:使用CODE获取到Token值时,返回的refresh_token参数

<?php
$wx = new \Wechat\Sdk();
// 更新token
$array = $wx->union()->save_token('refresh_token参数');
return $this->fetch(dd($array));

静默授权获取用户信息

该接口返回值为微信官方的return值,支持传递1个参数:
$param-1:用户的OpenId

<?php
$wx = new \Wechat\Sdk();
// 静默授权获取用户信息
$array = $wx->union()->basic('oOz-EuBWers5uTrV3vt0l0-E40Wo');
return $this->fetch(dd($array));

关于支付API的返回值

微信支付SDK的返回值为统一数据结构,除H5外,其他四种返回值如下。
返回值如下:

[
    'appId' => '', // APPID
    'timeStamp' => '', // 签名时间戳
    'nonceStr' => '', // 签名随机字符串
    'signType' => '', // 签名类型
    'paySign' => '', // 签名字符串
    'prepayid' => '', // 预支付交易会话标识
    'mch_id' => '', // 商户ID
    'code_url' => '', // 二维码模式时才有的二维码URL
]

小程序/JSAPI

返回值参考关于支付API的返回值部分。
该接口支持传递5个参数:
$param-1:支付状态通知地址
$param-2:支付用户的OpenId
$param-3:订单金额(元)
$param-4:订单号,默认null,为null时内部会自动创建一个16位的订单号
$param-5:商品描述,默认订单支付

<?php
$wx = new \Wechat\Sdk();
// 小程序/JSAPI支付
$array = $wx->pay()->jsapi('http://www.sw-x.cn', 'oOz-EuBWers5uTrV3vt0l0-E40Wo', '100', 'TS0001', '测试支付');
// 调用失败
if ($array == false) {
    return $this->fetch(dd($wx->get_error()));
}
return $this->fetch(dd($array));

H5支付

返回值为,支付的URL地址。
该接口支持传递5个参数:
$param-1:支付状态通知地址
$param-2:订单金额(元)
$param-3:订单号,默认null,为null时内部会自动创建一个16位的订单号
$param-4:取消支付时的回跳地址,默认
$param-5:商品描述,默认订单支付

<?php
$wx = new \Wechat\Sdk();
// H5支付
$array = $wx->pay()->h5('http://www.sw-x.cn', '100', 'TS0001', 'http://www.sw-x.cn/no.html','测试支付');
// 调用失败
if ($array == false) {
    return $this->fetch(dd($wx->get_error()));
}
return $this->fetch(dd($array));

APP支付

返回值参考关于支付API的返回值部分。
该接口支持传递4个参数:
$param-1:支付状态通知地址
$param-2:订单金额(元)
$param-3:订单号,默认null,为null时内部会自动创建一个16位的订单号
$param-4:APP在应用市场里的名称

<?php
$wx = new \Wechat\Sdk();
// APP支付
$array = $wx->pay()->app('http://www.sw-x.cn', '100', 'TS0001', '王者荣耀');
// 调用失败
if ($array == false) {
    return $this->fetch(dd($wx->get_error()));
}
return $this->fetch(dd($array));

二维码(模式一)

返回值参考关于支付API的返回值部分。
该接口支持传递4个参数:
$param-1:支付状态通知地址
$param-2:订单金额(元)
$param-3:订单号,默认null,为null时内部会自动创建一个16位的订单号
$param-4:商品描述,默认订单支付

<?php
$wx = new \Wechat\Sdk();
// 二维码模式一支付
$array = $wx->pay()->qrcode('http://www.sw-x.cn', '100', 'TS0001', '订单支付');
// 调用失败
if ($array == false) {
    return $this->fetch(dd($wx->get_error()));
}
return $this->fetch(dd($array));

二维码(模式二)

返回值参考关于支付API的返回值部分。
该接口支持传递4个参数:
$param-1:商品ID

<?php
$wx = new \Wechat\Sdk();
// 二维码模式二支付
$array = $wx->pay()->qrcode2(101);
// 该模式只是用于生成签名信息,植入到官方的URL中,所以不存在生成失败的可能
return $this->fetch(dd($array));