微信公众号开发创建菜单
xuexi 2025-04-12 17:23:06 发表在:PHP 查看数:88
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;//文件存储
use \DB;
use App\Models\Code_log;

use Validator;
class WeixinController extends Controller
{


 public function index(Request $request)
{


        // 获取有效的 access_token(需确保此方法返回有效 token)
        $accessToken = $this->access_token($request);
        echo $accessToken;
        if (!$accessToken) {
            return response('获取 access_token 失败', 500);
        }

        // 构建微信菜单接口 URL(修复变量插值问题)
        $url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token={$accessToken}";

        // 正确的菜单数据结构
        $menuData = [
            "button" => [
                [
                "type" => "view",
                "name" => "稻花香",
                "url"  => " http"

                ],
                 [
                "type" => "view",
                "name" => "自营小店",
                "url"  => "https://store.weixin.qq.com/shop"
                 ],
                  [
                "type" => "scancode_push",
                "name" => "扫码防伪",
                "key"=> "rselfmenu_0_1", 
                 "sub_button"=> [ ]
                 ]
            ]
        ];

        // 初始化 cURL
        $ch = curl_init();

        // 设置 cURL 选项(关键修正点)
        curl_setopt_array($ch, [
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => json_encode($menuData, JSON_UNESCAPED_UNICODE), // 必须使用 JSON 编码
            CURLOPT_HTTPHEADER => [
                'Content-Type: application/json', // 修正 header 格式
            ],
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_TIMEOUT => 30
        ]);

        // 执行请求
        $response = curl_exec($ch);

        // 处理 cURL 错误
        if (curl_errno($ch)) {
            $errorMsg = 'cURL 错误: ' . curl_error($ch);
            curl_close($ch);
            return response($errorMsg, 500);
        }

        // 获取 HTTP 状态码
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        // 解析微信响应
        $result = json_decode($response, true);

        if ($httpCode == 200 && isset($result['errcode']) && $result['errcode'] == 0) {
            return response('菜单创建成功');
        } else {
            // 记录错误日志(建议添加)
            // Log::error('微信菜单创建失败', ['response' => $result]);
            return response('菜单创建失败: ' . ($result['errmsg'] ?? '未知错误'), 500);
        }

}

    // 微信服务器验证
    protected function check(Request $request)
    {
        // 记录调试日志
        Storage::put('微信开发2.txt', json_encode([
            'signature' => $request->signature,
            'timestamp' => $request->timestamp,
            'nonce' => $request->nonce,
            'echostr' => $request->echostr
        ]));

        $weixin_signature = $request->signature;
        $token = 'wuchangdamijiushiniu';
        $timestamp = $request->timestamp;
        $nonce = $request->nonce;

        // 生成签名
        $params = [$token, $timestamp, $nonce];
        sort($params, SORT_STRING);
        $my_signature = sha1(implode('', $params));

        // 安全比较签名
        if (hash_equals(strtolower($my_signature), strtolower($weixin_signature))) {
            //return response($request->echostr)->header('Content-Type', 'text/plain'); // 注意参数名 `echostr`
            return true;
        } else {
            return false;
           // return response('签名验证失败', 403); // 返回 HTTP 403 错误
        }
    }
 //获取token
  protected function access_token(Request $request){
      //微信公众号获取accessToken
    Storage::put('微信开发.txt',  $request);      
    $appid ='xxxxx'; 
    $appSecret ='xxxxx'; 
    $curl = curl_init();
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt_array($curl, array(
            CURLOPT_URL => "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=xxx&secret=xxx",
            CURLOPT_TIMEOUT => 30,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_CUSTOMREQUEST => 'POST',
            CURLOPT_HTTPHEADER => array(
                'Content-Type: application/json',
                'Accept: application/json'
            ),
        ));
        $response = curl_exec($curl);
        curl_close($curl);
        //return $response;
         $tokendata = json_decode($response, true);
          return $tokendata['access_token'];
       // 获取微信公众号获取accessToken结束
     }
}
最近访问时间:2025-04-28 21:47:29
知识库:340条鸣谢:TAY  备案号:蜀ICP备2024090044号