cxfoot/controllers/WechatController.php
2023-11-24 09:50:42 +08:00

316 lines
14 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* @author Any
* @description KISS
* @date 2021年6月2日
* @version 1.0.0
*
* _____LOG_____
*
*/
namespace app\controllers;
use app\components\SiteHelper;
use app\models\Dev;
use app\models\Store;
use app\models\wechat\WechatApp;
use app\modules\api\behaviors\LoginBehavior;
use app\models\common\CommonAddressActionForm;
use app\models\common\CommonAddressListForm;
use app\models\common\CommonAddressEditForm;
use app\models\Address;
use app\modules\api\models\WindowsApiForm;
use Wechat\Wechat;
class WechatController extends Controller
{
public $_cx_token_type;
public $enableCsrfValidation = false;
public function behaviors()
{
return array_merge(parent::behaviors(), [
/*'login' => [
'class' => LoginBehavior::className(),
'ignore' => [
'wechat/index',
]
]*/
]);
}
private $_msg_template = array(
'text' => '<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content></xml>',//文本回复XML模板
'image' => '<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[image]]></MsgType><Image><MediaId><![CDATA[%s]]></MediaId></Image></xml>',//图片回复XML模板
'music' => '<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[music]]></MsgType><Music><Title><![CDATA[%s]]></Title><Description><![CDATA[%s]]></Description><MusicUrl><![CDATA[%s]]></MusicUrl><HQMusicUrl><![CDATA[%s]]></HQMusicUrl><ThumbMediaId><![CDATA[%s]]></ThumbMediaId></Music></xml>',//音乐模板
'news' => '<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[news]]></MsgType><ArticleCount>%s</ArticleCount><Articles>%s</Articles></xml>',// 新闻主体
'news_item' => '<item><Title><![CDATA[%s]]></Title><Description><![CDATA[%s]]></Description><PicUrl><![CDATA[%s]]></PicUrl><Url><![CDATA[%s]]></Url></item>',//某个新闻模板
);
/**
* @微信入口
*/
public function actionIndex(){
if(!empty($_GET["signature"]) && !empty($_GET['echostr'])){
return $this->checkSignature();
}
return $this->responseMsg();
}
private function checkSignature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = "3u57ghc5dwh4pc6vsch4xqnqw5egg7cu";
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
return $_GET['echostr'];
}else{
return false;
}
}
public function responseMsg(){
$xml_str = file_get_contents("php://input");
/*
获得请求时POST:XML字符串
不能用$_POST获取因为没有key
*/
\Yii::info("进入",'wxpay');
$msg = "";
if(!empty($xml_str)){
// 解析该xml字符串利用simpleXML
// libxml_disable_entity_loader(true);
//禁止xml实体解析防止xml注入
$request_xml = simplexml_load_string($xml_str, 'SimpleXMLElement', LIBXML_NOCDATA);
\Yii::info(json_encode($request_xml),'wxpay');
// $msg = sprintf($this->_msg_template['text'], $request_xml->FromUserName, $request_xml->ToUserName, time(), );
\Yii::info($msg,'wxpay');
//判断该消息的类型通过元素MsgType
switch ($request_xml->MsgType){
case 'event':
//判断具体的时间类型(关注、取消、点击)
$event = $request_xml->Event;
if ($event=='subscribe') { // 关注事件
// $this->_doSubscribe($request_xml);
}elseif ($event=='CLICK') {//菜单点击事件
$id = $request_xml->EventKey;
if($id == 'diamond_cards'){
$wechat_mp = $this->getWechat();
// 推送客服消息
$url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=".$wechat_mp->getAccessToken();
try{
$to_user = reset($request_xml->FromUserName);
}catch (\Exception $e){
$to_user = $request_xml->FromUserName;
}
$arr = [
'touser' => $to_user,
'msgtype' => 'wxcard',
'wxcard' => [
'card_id' => 'pVD1TwKeveIHet_0h-SnfL2VYGjU',
],
];
$res = $wechat_mp->curl->post($url,json_encode($arr,JSON_UNESCAPED_UNICODE));
}
// $this->_doClick($request_xml);
}elseif ($event=='VIEW') {//连接跳转事件
// $this->_doView($request_xml);
}elseif ($event=='SCAN') {
$id = $request_xml->EventKey;
// 查找数据,并发送文本
$find = Dev::findOne([
'id' => $id,
]);
if(empty($find)){
return false;
}
// 查找门店
$find_store = Store::findOne([
'id' => $find->store_id,
]);
$wechat_mp = "";
$wechat_mp = $this->getWechat();
// 推送客服消息
$url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=".$wechat_mp->getAccessToken();
$to_url = urlencode(SiteHelper::getCustomiseOptionByKey("siteDomain", "hump")."/site");
$state = $find->id."_".$find->store_id."_".time();
$res_url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid={$wechat_mp->appId}&redirect_uri={$to_url}&response_type=code&scope=snsapi_userinfo&state={$state}#wechat_redirect";
try{
$to_user = reset($request_xml->FromUserName);
}catch (\Exception $e){
$to_user = $request_xml->FromUserName;
}
$site_name = SiteHelper::getCustomiseOptionByKey("siteName", "hump");
$arr = [
'touser' => $to_user,
'msgtype' => 'news',
'news' => [
'articles' => [
[
'title' => "欢迎您使用{$site_name}足部检测仪!",
'description' => "当前门店:".$find_store->name."\n当前设备编号:{$find->dev_number}",
'url' => $res_url,
'picurl' => SiteHelper::getCustomiseOptionByKey("siteDomain", "hump").'/upload/0/1/upload/image/2023/1026/1698312821606159.jpg',
]
],
],
];
$res = $wechat_mp->curl->post($url,json_encode($arr,JSON_UNESCAPED_UNICODE));
\Yii::info(json_encode($res),'wxpay');
\Yii::info(json_encode($arr).$request_xml->FromUserName,'wxpay');
$text = "欢迎来到英舒迪公众号";
$msg = sprintf($this->_msg_template['text'], $request_xml->FromUserName, $request_xml->ToUserName, time(),$text);
$msg = "";
}else{
}
break;
case 'text'://文本消息
// $this->_doText($request_xml);
break;
case 'image'://图片消息
// $this->_doImage($request_xml);
break;
case 'voice'://语音消息
// $this->_doVoice($request_xml);
break;
case 'video'://视频消息
// $this->_doVideo($request_xml);
break;
case 'shortvideo'://短视频消息
// $this->_doShortvideo($request_xml);
break;
case 'location'://位置消息
// $this->_doLocation($request_xml);
break;
case 'link'://链接消息
// $this->_doLink($request_xml);
break;
}
}
return $msg;
}
public function getWechat(){
$wechat_app = WechatApp::findOne([
'cx_mch_id' => 0,
'is_delete' => 0
]);
if($wechat_app){
if (!is_dir(\Yii::$app->runtimePath . '/pem')) {
mkdir(\Yii::$app->runtimePath . '/pem');
file_put_contents(\Yii::$app->runtimePath . '/pem/index.html', '');
}
$cert_pem_file = null;
if ($wechat_app->cert_pem) {
$cert_pem_file = \Yii::$app->runtimePath . '/pem/' . md5($wechat_app->cert_pem);
if (!file_exists($cert_pem_file))
file_put_contents($cert_pem_file, $wechat_app->cert_pem);
}
$key_pem_file = null;
if ($wechat_app->key_pem) {
$key_pem_file = \Yii::$app->runtimePath . '/pem/' . md5($wechat_app->key_pem);
if (!file_exists($key_pem_file))
file_put_contents($key_pem_file, $wechat_app->key_pem);
}
$wechat_mp = new Wechat([
'appId' => $wechat_app->app_id,
'appSecret' => $wechat_app->app_secret,
'mchId' => $wechat_app->mch_id,
'apiKey' => $wechat_app->key,
'certPem' => $cert_pem_file,
'keyPem' => $key_pem_file,
]);
return $wechat_mp;
}
return false;
}
/**
* @ 更新菜单
*/
public function actionUpMenu(){
$wechat_app = WechatApp::findOne([
'cx_mch_id' => 0,
'is_delete' => 0
]);
if($wechat_app){
if (!is_dir(\Yii::$app->runtimePath . '/pem')) {
mkdir(\Yii::$app->runtimePath . '/pem');
file_put_contents(\Yii::$app->runtimePath . '/pem/index.html', '');
}
$cert_pem_file = null;
if ($wechat_app->cert_pem) {
$cert_pem_file = \Yii::$app->runtimePath . '/pem/' . md5($wechat_app->cert_pem);
if (!file_exists($cert_pem_file))
file_put_contents($cert_pem_file, $wechat_app->cert_pem);
}
$key_pem_file = null;
if ($wechat_app->key_pem) {
$key_pem_file = \Yii::$app->runtimePath . '/pem/' . md5($wechat_app->key_pem);
if (!file_exists($key_pem_file))
file_put_contents($key_pem_file, $wechat_app->key_pem);
}
$wechat_mp = new Wechat([
'appId' => $wechat_app->app_id,
'appSecret' => $wechat_app->app_secret,
'mchId' => $wechat_app->mch_id,
'apiKey' => $wechat_app->key,
'certPem' => $cert_pem_file,
'keyPem' => $key_pem_file,
]);
// 推送客服消息
$url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$wechat_mp->getAccessToken();
$to_url = urlencode(SiteHelper::getCustomiseOptionByKey("siteDomain", "hump")."/site");
$res_url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid={$wechat_app->app_id}&redirect_uri={$to_url}&response_type=code&scope=snsapi_userinfo&state=#wechat_redirect";
$arr = [
'button' => [
[
'type' => 'view',
'name' => '官网',
'url' => "https://benson688.com/",
],
[
'type' => 'miniprogram',
'name' => '官网',
'url' => "https://benson688.com/",
"appid"=>"wx7d887db4a4701186",
"pagepath"=>"pages/index/index",
],
[
"name" => "菜单",
"sub_button" => [
[
'type' => 'view',
'name' => '英舒迪AI聊天工具',
'url' => "https://ai.benson688.com/h5/?i5hy",
],
[
'type' => 'view',
'name' => '携厦大研发保健鞋',
'url' => "https://i.benson688.com/h5/1.html#/activity/luntan/index",
],
[
'type' => 'click',
'name' => '英舒迪钻石尊享卡',
"key" => "diamond_cards",
],
],
]
],
];
$res = $wechat_mp->curl->post($url,json_encode($arr,JSON_UNESCAPED_UNICODE));
var_dump($res);
}
}
}