lfphp/wechatsdk

0.1.0 2024-11-23 12:38 UTC

This package is auto-updated.

Last update: 2024-11-23 12:39:04 UTC


README

1. 安装

本SDK目前仅支持composer安装,如需其他安装方式,请自行下载相应库代码改造。

安装:

composer require lfphp/wechatsdk

2. 公众号开发环境配置

2.1 配置基本域名信息

进入【设置与开发】 > 【账号设置】 > 【功能设置】,配置业务相关域名信息,包括:

  • 业务域名必须
  • JS接口安全域名前端JS接口场景必须
  • 网页授权域名后端回调必须)。

2.2 配置技术相关参数

进入 mp.weixin.qq.com ,访问【设置与开发】 > 【开发接口管理】 菜单。

  • 获取开发者ID(AppID)信息
  • 获取令牌(Token)
  • 设置开发者密码(AppSecret)(必须
  • 添加后台接口访问IP白名单(必须
  • 配置并启用【服务器配置】中的
    • 服务器地址(URL)必须
    • 消息加解密密钥(EncodingAESKey)必须
    • 选择 消息加密方式(请使用【安全模式】,当前库大部分函数也是基于这个模式)(必须)。

2.3 验证服务器地址

假设服务器地址(URL)配置为:https://www.site.com/callback.php,则在 callback.php 代码中实现服务器校验代码示例为:

<?php
use function LFPhp\WechatSdk\Util\wechat_echo_validation;

//微信接口校验模式
$token = ''; //请填入 2.2 中获取的【令牌(Token)】
if($_GET['echostr']){
    wechat_echo_validation($token);
    die;
}

//否则为微信常规回调模式
//正常微信回调业务代码···

3. 接收处理微信回调

3.1 获取回调数据

在上述处理响应代码中,继续追加正常微信回调业务代码:

<?php
use function LFPhp\WechatSdk\Util\wechat_decode_callback;
//上接【2.3】中微信接口校验代码···

$app_id = ''; //请填入 2.2 中获取的【开发者ID(AppID)】
$token = ''; //请填入 2.2 中获取的【令牌(Token)】
$encoding_aes_key = ''; //请填入 2.2 中设置的 【消息加解密密钥(EncodingAESKey)】

//解析并获取微信回调数据 
$data = wechat_decode_callback($app_id, $token, $encoding_aes_key);

//数据调试
var_dump($data); 

上述代码中 $data 即为微信回调数组,详细格式请参考 微信开发文档

3.2 转换为事件对象

本SDK库封装常规事件对象,方便在实际代码中调用判断。以下示例仅以普通文本消息为例

<?php
use LFPhp\WechatSdk\Message\Message\MessageText;
use LFPhp\WechatSdk\Message\MessageBase;

//上接【3.1】中回调数据获取代码
//$data 为上一步骤中解析出来的数组
$receive_msg = MessageBase::getMessageInstance($data);
if($receive_msg instanceof EventSubscribe ||
    $receive_msg instanceof EventScan){
    $success_msg = new MessageText;
    $success_msg->ToUserName = $receive_msg->FromUserName;
    $success_msg->FromUserName = $receive_msg->ToUserName;
    $success_msg->CreateTime = time();
    if($receive_msg->Ticket){
        //公众号扫码成功
    } else {
        //公众号扫码订阅成功
    }
}

4. 获取 access_token js_ticket page_access_token

公众号后端接口调用基本都依赖 access_token,应用需要获取 access_token 保存到本地,并定期刷新 access_token (一般有效期为 7200 s) 应用H5页面js调用接口需要 js_ticket 信息(一般有效期为7200s),应用需要获取并刷新该 js_ticket 微信环境H5 oAuth方式登录依赖页面page_access_token(不是后端接口的access_token)

4.1 获取 access_token

<?php
use LFPhp\WechatSdk\Service\Auth;

$app_id = ''; //请填入 2.2 中获取的【开发者ID(AppID)】
$app_secrect = ''; //请填入 2.2 中获取的【开发者密码(AppSecret)】
list($access_token, $expires) = Auth::getAccessToken($app_id, $app_secrect);

//todo 应用需要保存 $access_token 到本地

4.2 获取 js_ticket

<?php
use LFPhp\WechatSdk\Service\JSAuth;

$app_id = ''; //请填入 2.2 中获取的【开发者ID(AppID)】
$app_secrect = ''; //请填入 2.2 中获取的【开发者密码(AppSecret)】
list($ticket, $expires) = JSAuth::getJsTicket($app_id, $app_secrect);

//todo 应用需要保存 $ticket 到本地

4.3 获取 page_access_token

需要微信oAuth登录流程获取微信返回code,才能获取并使用 page_access_token, 具体请见 步骤5

<?php
use LFPhp\WechatSdk\Service\PageAuth;

$app_id = ''; //请填入 2.2 中获取的【开发者ID(AppID)】
$app_secrect = ''; //请填入 2.2 中获取的【开发者密码(AppSecret)】
$code = $_GET['code'];  //微信登录回调code
$page_access_token = PageAuth::getAccessToken($app_id, $app_secret, $code);

5. 后端请求公众号接口

以获取公众号分享二维码为例,其他功能请参考 Service 下个类库方法

<?php
use LFPhp\WechatSdk\Base\AuthorizedService;
use LFPhp\WechatSdk\Service\QRCode;

$access_token = ''; //读取 4.1 中本地保存的 access_token

//初始化需要鉴权的服务
//需要鉴权类的服务调用前都必须初始化access_token信息
AuthorizedService::setAccessToken($access_token);

$info = QRCode::createTemporaryQRCode($scene);

//打印二维码图像地址
var_dump($info['qrcode_url']);

//输出到html中:
echo '<img src="'.$info['qrcode_url'].'"/>';

6. 页面oAuth鉴权流程

微信页面登录流程示意:

wechat_login_flow

以下为各个关键环节代码示意。

【2】判断是否微信H5环境:

<?php 
/**
 * 判断浏览器在微信中
 * @return bool
 */
function in_wechat(){
	return !!preg_match('/MicroMessenger/i', $_SERVER['HTTP_USER_AGENT']) && !in_wework();
}

/**
 * 判断浏览器在企业微信中
 * @return bool
 */
function in_wework(){
	return !!preg_match('/wxwork/i', $_SERVER['HTTP_USER_AGENT']);
}

if(in_wechat()){
    //处于微信环境,继续处理登录逻辑【3】
}

【3】构建登录鉴权URL,并跳转:

<?php
use LFPhp\WechatSdk\Service\PageAuth;
use function LFPhp\Func\http_redirect;
use function LFPhp\Func\http_get_current_page_url;

$app_id = ''; //请填入 2.2 中获取的【开发者ID(AppID)】
$AUTH_SCOPE = PageAuth::SCOPE_BASE; //设置为获取用户基本信息(只有openid,静默授权)
$state = ''; //填入自定义透传变量

//回调页面地址,可以自行指定需要实现回调逻辑的页面地址。如果是和跳出页面同一个,需要处理好入口分支逻辑。
$callback_url = http_get_current_page_url(); 

$login_url = PageAuth::getAuthUrl($app_id, $callback_url, $AUTH_SCOPE, $state);

//页面跳转到微信鉴权页面
http_redirect($login_url);

【6】解析微信登录回调数据

<?php
use LFPhp\WechatSdk\Service\PageAuth;

$app_id = ''; //请填入 2.2 中获取的【开发者ID(AppID)】
$app_secrect = ''; //请填入 2.2 中获取的【开发者密码(AppSecret)】

$state = ''; //这里state为【3】中填入的透传变量,如果没有设置可以不用判断
$code = $_GET['code'];

//简单判断是否为合法微信回调
if($_GET['state'] == $state && $code){
    
	//获取页面access token信息    
    $page_access_token_info = PageAuth::getAccessToken($app_id, $app_secret, $code);
    
    $open_id = $page_access_token_info['openid'];
    
    //如果登录SCOPE为userinfo,拉取更多用户信息,否则没有更多用户信息
    $wechat_user_info = [];
    if($scope === PageAuth::SCOPE_USERINFO){
        $wechat_user_info = PageAuth::getSnsUserInfo($page_access_token_info['access_token'], $open_id);
    }

    //【7】todo 业务代码自行实现登录逻辑
    login_by_open_id($open_id);
    
    //登录成功,接下来可以选择跳转回业务首页,或者业务自定义处理逻辑
}

7. 前端JS调用

前端JS调用微信前端能力,需要通过步骤3.2 获取到可用 js_ticket

7.1 前端微信JSSDK初始化

前端初始化代码如下:

<?php
use LFPhp\WechatSdk\Service\JSAuth;
use function LFPhp\Func\http_get_current_page_url;

$app_id = ''; //请填入 2.2 中获取的【开发者ID(AppID)】

//请填入 4.2 存储的有效 js_ticket
$js_ticket = '';

//快速计算前端初始化相关信息
$config_info = JSAuth::generateJsSignatureSimple($js_ticket, http_get_current_page_url());
?>
    
<!-- HTML 代码部分 -->
<!-- 引入微信JSSDK -->
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js">
<script>
	const WECHAT_JS_CONFIG = {
		debug: false,
		appId: '$app_id',
		timestamp: <?=$config_info['timestamp'];?>,
		nonceStr: '<?=$config_info['noncestr'];?>',
		signature: '<?=$config_info['signature'];?>',
		jsApiList: [ //需要的js api接口列表,可自行增减
			'updateAppMessageShareData', //分享微信好友
			'updateTimelineShareData' //分享朋友圈
		]
	};
	//执行微信JSSDK初始化
	wx.config(WECHAT_JS_CONFIG);
</script>

7.2 前端微信接口调用

在上一步前端初始化代码后,可通过 wx.ready() 方法判断是否初始化完成,完成后可以调用相应微信前端接口 以下仅以微信分享来举例:

<!-- 这部分代码必须在步骤 7.1之后执行 -->
<script>
wx.ready(()=>{
  wx.updateAppMessageShareData({
    title: '', //填入页面标题
    desc: '', //填入页面描述
    link: '', //分享页面地址,一般为当前页面
    imgUrl: '', //分享页面缩略图,
    success: function(){
		//成功回调
        console.log('微信分享好友信息设置成功');
    }
  });
});
</script>

8. 其他场景应用

  1. 公众号扫码订阅方式登录 //todo