微信群發,那些我踩過的坑

2021-09-26 05:59:45 字數 4281 閱讀 3284

開發環境:框架使用tp3.2.3,php版本》=5.6

1. 獲取access_token

**:

/**

* 建議這個函式寫在公共方法或其他公共類中,方便呼叫

*/function getaccesstoken()

s('access_token',$result['access_token'],$result['expires_in']);

return $result['access_token'];

}/*** 公共函式,curl訪問遠端連線

* @param string $url 需要訪問的連線

* @param array|string $data post請求方式時,需要提交的資料

*/ function request_curl($url, $data = '')

curl_setopt($ch, curlopt_returntransfer, true);

$result = curl_exec($ch);

curl_close($ch);

$rs = json_decode($result, 1);

return $rs;

}/**

* 每次在用到的地方調取函式獲取access_token的方法

*/ $accesstoken = s('access_token');

if(empty($accesstoken))

2. 準備素材

(1)上傳**訊息內的獲取url【訂閱號與服務號認證後均可用】

/**

*/public function uploadimg()

// 大小判斷,單位位元組

$file_size = filesize($news_url);

if(bccomp($file_size, 1024*1024) >= 0)

//首先獲取access_token

$accesstoken = s('access_token');

if(empty($accesstoken))

$wx_url = ''.$accesstoken;

$wx_data = array('media'=>new \curlfile(realpath(c('upload_img_path').$news_url))); // php版本<=5.5的,可以使用array('media'=>'@'.$news_url)的方式上傳,php>=5.6的,只能使用curlfile上傳,建議使用curlfile上傳

$res = request_curl($wx_url ,$wx_data);

if($res['url'])else

}}

(2)**訊息中需要的thumb_media_id的獲取(第二個坑:這個media_id的獲取,需要的是

,而不是

新增永久素材—新增其他型別永久素材

)**:

/**

* 因為上傳**訊息的介面中提到thumb_media_id是縮圖media_id,所以這裡處理按照「新增臨時素材」介面中規定的縮圖規格判斷上傳的

* @return json

*/public function mediaupload()

// 的型別判斷

// 大小判斷,單位位元組

$file_size = filesize($news_url);

if(bccomp($file_size, 64*1024) >= 0)

$material_type = 'thumb'; // 型別

$material_type_key = 'thumb_media_id'; // 上傳成功後返回的media_id的鍵名

//首先獲取access_token

$accesstoken = s('access_token');

if(empty($accesstoken))

$wx_url = ''.$accesstoken.'&type='.$material_type;

$wx_data = array('media'=>new \curlfile(realpath($news_url)));

$res = request_curl($wx_url ,$wx_data);

if($res['type'])else

}}

3. 準備需要上傳的**訊息(第三個坑:需要上傳的資訊,記得要做urlencode編碼,尤其訊息內容:含有雙引號的建議替換成單引號,特殊字元轉換成html實體再進行urlencode編碼;傳送post資料,傳送json格式,記得再將經過編碼處理的解碼後再傳送)

都準備好後,就應該上傳想要**的**訊息了,根據「上傳**資訊的介面」說明可知,每次最少上傳1條,最多可以上傳8條訊息,所以一定要注意。

**:

/**

* 這裡的前提條件:**訊息,都已經提前準備好

* @return json

*/public function uploadnews()

$mass_ids = explode(',', $mass_ids);

if(count($mass_ids) > 8)

$where = array();

$where['mass_id'] = array('in', $mass_ids);

$mass_res=$model->getwxbywhereselect($where); // 根據介面引數要求,獲取要上傳的**訊息字段值

foreach($mass_res as $mass_k => &$mass_v)else}}

$uploadnews = array(

'articles' => $mass_res,

);$uploadnews = htmlspecialchars_decode(urldecode(json_encode($uploadnews))); // 需要上傳的訊息,使用json串格式,然後使用urldecode及htmlspecialchars_decode對上面的資訊依次進行解碼

//首先獲取access_token

$accesstoken = s('access_token');

if(empty($accesstoken))

$url = ''.$accesstoken;

$uploadnews_res = request_curl($url, $uploadnews);

if($uploadnews_res['errcode'])elseelse

}}

4. **訊息(根據標籤進行**)

**:

/**

* 根據標籤**

* @return json

*/public function bytagmasssend()

$is_to_all = false;

if(empty($postdata['tag_id']))

$mass_send_arr = array(

'filter' => array(

'is_to_all' => $is_to_all,

'tag_id' => $postdata['tag_id'],

),'mpnews' => array(

'media_id' => $postdata['media_id']

),'msgtype' => 'mpnews',

'send_ignore_reprint' => $postdata['send_ignore_reprint']

);$mass_send_json = json_encode($mass_send_arr);

unset($mass_send_arr);

// **送

//首先獲取access_token

$accesstoken = s('access_token');

if(empty($accesstoken))

$url = ''.$accesstoken;

$mass_send_res = request_curl($url, $mass_send_json);

if($mass_send_res['errcode'] == 0)else

}else

}}

5. 到此,訊息**成功,在對應標籤下的使用者,能夠收到資訊。

考慮 php 5.0~5.6 各版本相容性的 curl 檔案上傳

踩坑 微信高階群發介面

1.根據openid列表 post例項 msgtype mpnews send ignore reprint 0 touser表示使用者openid列表,length至少為2,否則會報錯 invalid openid list size,at least two openid hint 畢竟是 2....

那些天我踩過的坑

使用knockoutjs時候,千萬不要在迴圈繫結中把dom元素的id寫死。例如在 input file 中 banging event change 時,千萬不要在ko.observablearray 中固定id屬性。如下所示 label for up img class am btn am btn...

微信SDK踩過的那些坑。。登入分享支付

1.應用中的包名 mainfext.xml中的package 必須與後台配置的一致。2.應用生成不能是debug包,必須是正式的簽名包。這個簽名必須與後台配置的一致。在第一點上,會出錯的概率還是比較小的。而在後台配置的卻是直接從在eclipse打簽名包時直接複製出來的md5簽名。大寫,並且中間夾雜 ...