---
layout: post
title: 亲自体验微信推送的制作感受
tags: [微信, 推送]
---

  感谢大佬完成了最复杂的部分😂<!--more-->    
  
# 起因
  我在上个月写了一个[Server酱Mini测试号版](/2021/02/02/serverchan.html)，在此之后有位叫做[guanzi008](https://github.com/guanzi008)大佬看到了我的文章，并愿意给我提供一个有微信认证的公众号让我体验一下Server酱的实际制作过程，对此我表示非常感谢，把最复杂的事情做完了。像那个Server酱那个平台说过Ta唯一做的事情就是注册了一个有微信认证的公众号而已，毕竟微信开放文档傻子都能看懂，没什么技术难度。   
  正好这次有了这个机会，我就可以真正体验一下测试号和通过了微信认证的服务号之间到底有什么样的区别。   

# 实际体验
  我以前虽然没有微信认证的公众号，不过曾经有用过同学注册的一个个人的公众号，那个是真的废物，接口几乎全都不能用……现在有了微信认证的公众号之后发现虽然这个非常不错，功能基本上该有的都有了，不过有一些地方还是和测试号各有千秋。比如说测试号的监察要松的多，像模板消息根本没有限制，而且无论发什么东西都不用担心封号。而这个认证公众号的监察就要严的多，直接发违法消息肯定是别想了，就说模板消息还必须要用已有的模板，用没有的必须要通过审核。另外我感觉那个所谓的模板消息下线应该是烟雾弹，人家官方文档说的很清楚，**服务号订阅通知功能开启灰度测试，模板消息能力可正常使用**，所以不用太担心。   
  那个所谓的订阅通知的功能我已经试过了，很烂，要想推送必须要让用户同意，而且是每一次，也就是说用户同意一次才有一次的通知权，所以说就很废物。倒是有一个长期订阅，就是搞起来非常麻烦。还好模板消息目前来看是只要申请就可以使用。所以接下来我就完善了一下我之前在测试号上用的代码，增加了Access Token缓存，支持POST请求，并且增加了摘要、HTML、Markdown等功能，代码如下：
```php
<?php
$appid='公众号APPID';
$secret='公众号Secret';
$userid=$_GET['userid'];
$template_id='模板ID';
$title=addslashes($_REQUEST['title']);
$summary=addslashes($_REQUEST['summary']);
$content=addslashes($_REQUEST['content']);

$addHTML="";
session_id('Storagepush');
session_start();
if(!$summary){
    $summary=$content;
}
if(!json_decode(file_get_contents('https://api.weixin.qq.com/cgi-bin/get_api_domain_ip?access_token='.$_SESSION['access_token']),true)['ip_list']){
$_SESSION['access_token']=json_decode(file_get_contents('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$secret),true)['access_token'];
}
if($_GET['type'] == "md"){
    include_once("Parsedown.php");
    $Parsedown = new Parsedown();
    //$Parsedown->setSafeMode(true);
    $content = $Parsedown->text($content);
    $_GET['type'] = "html";
}
if($_GET['type'] == "html"){
    $filename='html/'.md5(uniqid(mt_rand(), true)).'.html';
    file_put_contents($filename, '<meta name="viewport" content="width=device-width, initial-scale=1"><title>'.$title.'</title><h1>'.$title.'</h1><hr>'.$content.'<hr><center>Powered By <a href="https://mabbs.github.io/">Mayx</a></center>');
    $addHTML='"url":"https://'.$_SERVER['HTTP_HOST'].'/'.$filename.'", ';
}

echo file_get_contents('https://api.weixin.qq.com/cgi-bin/message/template/send?access_token='.$_SESSION['access_token'], false, stream_context_create(array('http' => array('method'=>'post','header'=>"Content-Type: application/json;charset=utf-8",'content'=>'{"touser":"'.$userid.'","template_id":"'.$template_id.'", '.$addHTML.'"data":{"first": {"value":"'.$title.'"}, "keyword1": {"value":"'.$summary.'"}, "keyword2": {"value":"'.date('Y-m-d H:i:s').'"}}}'))));
```
  要想使用这个代码的话需要用到[Parsedown](https://github.com/erusev/parsedown)的库，另外模板消息我用的是ID为`OPENTM207965242`的模板，如果有人想要用的话也建议用同一个模板。   
  另外对于用户的OPENID的获取……想用的话就自己想办法吧，获取OPENID这种事情很简单。   
  从体验上来说应该是吊打Server酱那种垃圾，而且还没有广告。理论上最大每日推送量是10w次，当账号粉丝数超过10W/100W/1000W时，模板消息的日调用上限会相应提升。不过这个不防滥用，所以还是需要注意一点的。   

# 使用文档

| 参数 | 是否必填 | 请求方法 | 内容 |
| - | - | - | - |
| userid | 是 | GET | 用户的OPENID |
| type | 否 | GET | html/md/空 |
| title | 否 | GET/POST | 标题 |
| summary | 否 | GET/POST | 摘要（不填默认为内容） |
| content | 否 | GET/POST | 内容 |

# 后续的改进
  我目前用的公众号的所有人希望整一个像WxPusher的平台，我大概看了一下那个东西，果然还是个垃圾，要推送必须用那个平台特有的API，包括开源的那些乱七八糟的SDK也全部都是为那个所谓推送平台设计的，另外模板的选择也是真的没什么品味，体验实在是一般。所以目前似乎还没有一个像样的开源的微信推送平台，那接下来就让我试试看吧，我看看到底是为什么没有人愿意制作一个开源的微信推送平台吧！
