@@ -26,7 +26,12 @@ class Wechat {
26
26
const USER_INFO_URI = 'cgi-bin/user/info ' ;
27
27
const USER_LIST_URI = 'cgi-bin/user/get ' ;
28
28
const USER_LIST_INFO_URI = 'cgi-bin/user/info/batchget ' ;
29
+
29
30
31
+ const MENU_INFO = 'cgi-bin/get_current_selfmenu_info ' ;
32
+ const MENU_CREATE = 'cgi-bin/menu/create ' ;
33
+ const TEMPLATE_MESSAGE_SEND = 'cgi-bin/message/template/send ' ;
34
+
30
35
const AUTH_URI = 'connect/oauth2/authorize ' ;
31
36
const AUTH_ACCESS_TOKEN_URI = 'sns/oauth2/access_token ' ;
32
37
const AUTH_USER_URI = 'sns/userinfo ' ;
@@ -218,6 +223,73 @@ public function get_auth_user($openid , $access_token , $lang = 'zh_CN'){
218
223
219
224
return $ this ->return_data ($ data );
220
225
}
226
+
227
+ /**
228
+ * 查询自定义菜单
229
+ * @return boolean|\Org\Com\unknown
230
+ */
231
+ function get_menu_info (){
232
+
233
+ $ url = self ::API_URI . self ::MENU_INFO ;
234
+ $ param ['access_token ' ] = $ this ->access_token ;
235
+ $ menu_url = $ this ->create_url ($ url , $ param );
236
+
237
+ $ data = $ this ->http_get ($ menu_url );
238
+
239
+ return $ this ->return_data ($ data );
240
+ }
241
+
242
+ /**
243
+ * 创建自定义菜单
244
+ * @param unknown $menu
245
+ * @return boolean|\niklaslu\unknown
246
+ */
247
+ function create_menu ($ menu ){
248
+
249
+ $ url = self ::API_URI . self ::MENU_CREATE ;
250
+ $ param ['access_token ' ] = $ this ->access_token ;
251
+ $ menu_url = $ this ->create_url ($ url , $ param );
252
+
253
+ $ fields = self ::json_encode ($ menu );
254
+ $ data = $ this ->http_post ($ menu_url , $ fields );
255
+ return $ this ->return_data ($ data );
256
+
257
+ }
258
+
259
+ /**
260
+ * 发送模板信息
261
+ * @param unknown $openid
262
+ * @param unknown $template_id
263
+ * @param unknown $template_url
264
+ * @param unknown $datas
265
+ * @return boolean|\niklaslu\unknown
266
+ */
267
+ public function send_template_msg ($ openid , $ template_id , $ template_url , $ datas = NULL ){
268
+
269
+ $ url = self ::API_URI . self ::TEMPLATE_MESSAGE_SEND ;
270
+ $ param ['access_token ' ] = $ this ->get_access_token ();
271
+
272
+ $ template_send_url = $ this ->create_url ($ url , $ param );
273
+
274
+ $ fields ['touser ' ] = $ openid ;
275
+ $ fields ['template_id ' ] = $ template_id ;
276
+ $ fields ['url ' ] = $ template_url ;
277
+ $ data = array ();
278
+ foreach ($ datas as $ k =>$ v ){
279
+ $ d ['value ' ] = $ v ;
280
+ $ d ['color ' ] = '#173177 ' ;
281
+
282
+ $ data [$ k ] = $ d ;
283
+ }
284
+ if ($ data ){
285
+ $ fields ['data ' ] = $ data ;
286
+ }
287
+
288
+ $ fields = json_encode ($ fields , true );
289
+ $ res = $ this ->http_post ($ template_send_url , $ fields );
290
+
291
+ return $ this ->return_data ($ res );
292
+ }
221
293
/**
222
294
* 返回data
223
295
* @param array $data
@@ -325,6 +397,55 @@ public function http_post($url, $fields, $data_type='json') {
325
397
}
326
398
}
327
399
400
+ /**
401
+ * 微信api不支持中文转义的json结构
402
+ * @param array $arr
403
+ */
404
+ static function json_encode ($ arr ) {
405
+ if (count ($ arr ) == 0 ) return "[] " ;
406
+ $ parts = array ();
407
+ $ is_list = false ;
408
+ //Find out if the given array is a numerical array
409
+ $ keys = array_keys ( $ arr );
410
+ $ max_length = count ( $ arr ) - 1 ;
411
+ if (($ keys [0 ] === 0 ) && ($ keys [$ max_length ] === $ max_length )) { //See if the first key is 0 and last key is length - 1
412
+ $ is_list = true ;
413
+ for ($ i = 0 ; $ i < count ( $ keys ); $ i ++) { //See if each key correspondes to its position
414
+ if ($ i != $ keys [$ i ]) { //A key fails at position check.
415
+ $ is_list = false ; //It is an associative array.
416
+ break ;
417
+ }
418
+ }
419
+ }
420
+ foreach ( $ arr as $ key => $ value ) {
421
+ if (is_array ( $ value )) { //Custom handling for arrays
422
+ if ($ is_list )
423
+ $ parts [] = self ::json_encode ( $ value ); /* :RECURSION: */
424
+ else
425
+ $ parts [] = '" ' . $ key . '": ' . self ::json_encode ( $ value ); /* :RECURSION: */
426
+ } else {
427
+ $ str = '' ;
428
+ if (! $ is_list )
429
+ $ str = '" ' . $ key . '": ' ;
430
+ //Custom handling for multiple data types
431
+ if (!is_string ( $ value ) && is_numeric ( $ value ) && $ value <2000000000 )
432
+ $ str .= $ value ; //Numbers
433
+ elseif ($ value === false )
434
+ $ str .= 'false ' ; //The booleans
435
+ elseif ($ value === true )
436
+ $ str .= 'true ' ;
437
+ else
438
+ $ str .= '" ' . addslashes ( $ value ) . '" ' ; //All other things
439
+ // :TODO: Is there any more datatype we should be in the lookout for? (Object?)
440
+ $ parts [] = $ str ;
441
+ }
442
+ }
443
+ $ json = implode ( ', ' , $ parts );
444
+ if ($ is_list )
445
+ return '[ ' . $ json . '] ' ; //Return numerical JSON
446
+ return '{ ' . $ json . '} ' ; //Return associative JSON
447
+ }
448
+
328
449
public function getCacheAccessToken (){
329
450
330
451
0 commit comments