现在人们越来越离不开微信,有数据统计平均每个人打开微信的次数为7-8次/天,与微信相关的技术也开始出现,比如微信二次开发,有可能很多人还不太懂知道微信二次开发,只知道别人都做了自己也要做,那么下面云端科技就浅谈一下,不涉及高深的技术只是让你能够清楚的知道这是怎么一件事。
@Controller
@RequestMapping("wechat")
public class WeChatController {
@RequestMapping(value = "/hello")
public String index(){
return "index";
}
@RequestMapping(value = "/detail")
public String detail(){
return "detailpage";
}
@RequestMapping(value = "/home",method= RequestMethod.GET)
@ResponseBody
public void valid(HttpServletRequest request, HttpServletResponse response) throws IOException {
boolean isGet = request.getMethod().toLowerCase().equals("get");
String code = request.getParameter("code");
if (isGet) {
// 微信加密签名
String signature = request.getParameter("signature");
// 时间戳
String timestamp = request.getParameter("timestamp");
// 随机数
String nonce = request.getParameter("nonce");
// 随机字符串
String echostr = request.getParameter("echostr");
PrintWriter out = response.getWriter();
// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
if (SignUtil.checkSignature(signature, timestamp, nonce)) {
out.print(echostr);
}
out.close();
out = null;
}else{
userpost(request,response);
}
}
@RequestMapping(value = "/home",method= RequestMethod.POST)
public void userpost(HttpServletRequest request, HttpServletResponse response) throws IOException {
request.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
String str = null;
String code = request.getParameter("code");
try {
Map<String, String> message = MessageUtil.xmlToMap(request);
String fromUser = message.get("FromUserName");
String toUser = message.get("ToUserName");
String content = message.get("Content");
String msgType = message.get("MsgType");
String msgId = message.get("MsgId");
Message ms = new Message();
ms.setContent(content);
ms.setFromUserName(toUser);
ms.setToUserName(fromUser);
ms.setMsgType(msgType);
str = MessageUtil.textMessageToXml(ms).replace("\n","").replace(" ","");
out.print(str);
out.close();
out = null;
}catch (Exception e){
e.printStackTrace();
}
}
签名认证
/**
* 请求校验工具类
*
* @author liufeng
* @date 2013-05-18
*/
public class SignUtil {
// 与接口配置信息中的Token要一致
private static String token = "chenmianhai";
/**
* 验证签名
*
* @param signature
* @param timestamp
* @param nonce
* @return
*/
public static boolean checkSignature(String signature, String timestamp, String nonce) {
String[] arr = new String[] { token, timestamp, nonce };
// 将token、timestamp、nonce三个参数进行字典序排序
Arrays.sort(arr);
StringBuilder content = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
content.append(arr[i]);
}
MessageDigest md = null;
String tmpStr = null;
try {
md = MessageDigest.getInstance("SHA-1");
// 将三个参数字符串拼接成一个字符串进行sha1加密
byte[] digest = md.digest(content.toString().getBytes());
tmpStr = byteToStr(digest);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
content = null;
// 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
}
/**
* 将字节数组转换为十六进制字符串
*
* @param byteArray
* @return
*/
private static String byteToStr(byte[] byteArray) {
String strDigest = "";
for (int i = 0; i < byteArray.length; i++) {
strDigest += byteToHexStr(byteArray[i]);
}
return strDigest;
}
/**
* 将字节转换为十六进制字符串
*
* @param mByte
* @return
*/
private static String byteToHexStr(byte mByte) {
char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
char[] tempArr = new char[2];
tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
tempArr[1] = Digit[mByte & 0X0F];
String s = new String(tempArr);
return s;
}
}
1.首先我们要有appid(wx4ff531ee8a470861)和appsecret(2ec9b2f1a1f67b8743d23f9fc70c1c97)。
2.这里我们用的是rh_mp与rh_mp_menu数据表。
3.首先我们在Common模块的Common文件夹下创建function.php文件,在里面我们写入以下获取access_token的代码和获取当前公众号的代码:
- function getAccess_token(){
- $mp=M('mp')->where('is_use=1')->find();
- if(empty($mp)) return false;
- $id=$mp['id'];
- if(empty($mp['access_token']) || $mp['expire_time']<time()){
- $appid=$mp['appid'];
- $appsecret=$mp['appsecret'];
- $url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret;//接口
- include APP_PATH.'LaneWeChat/lanewechat.php';
- $arr= \LaneWeChat\Core\Curl::callWebServer($url,'','GET');
- // print_r($arr);
- // exit;
- if(isset($arr['access_token'])){
- $data['access_token']=$arr['access_token'];
- $data['expire_time']=$arr['expires_in']+ time()-200;
- // print_r($data);
- // exit;
- // $data=M('mp')->create($data);
- M("mp")->where("id=$id")->save($data);
- return $arr['access_token'];
- }else{
- return false;
- }
- }else{
- return $mp['access_token'];
- }
- function getCurrentMp(){
- $mp=M('mp')->where('is_use=1')->find();
- return $mp;
- }
在menuController.class.php中增加以下代码:
- <?php
- namespace Home\Controller;
- use Think\Controller;
- use LaneWeChat\Core\menu;
- // define('WECHAT_APPID','wx4ff531ee8a470861');
- // define('WECHAT_APPSECRET','2ec9b2f1a1f67b8743d23f9fc70c1c97');
- class MenuController extends Controller {
- public function index(){
- $mp=getCurrentMp();
- if(empty($mp)){
- $this->error('无此公账号',U('mp/index'));
- }
- $data=M('mp_menu')->where("mp_id={$mp['id']}")->order('id')->select();
- $data2=$data;
- foreach ($data as $k => $v) {
- foreach ($data2 as $k2 => $v2) {
- if($v['index']==$v2['pindex']){
- $data[$k]['sub'][]=$v2;
- unset($data[$k2]);
- }
- }
- }
- $this->assign('mpInfo',$mp);
- $this->assign('list',$data);
- $this->display();
- }
- public function menuedit(){
- $mp=getCurrentMp();
- if(empty($mp)){
- $this->ajaxReturn(array('error'=>true,'msg'=>'无此公账号','url'=>U('mp/index')));
- exit;
- }
- $data=I('post.data');
- foreach ($data as &$value) {
- $value['mp_id']=$mp['id'];
- }
- // }print_r($value);
- // exit;
- // $this->ajaxReturn($data);
- // $arr=array();
- // foreach ($data1 as $key => $value) {
- // $row=array();
- // $row['mp_id']=$mp['id'];
- // $row['index']=$value['id'];
- // $row['pindex']=$value['pid'];
- // $row['name']=$value['name'];
- // $row['content']=$value['code'];
- // $row['type']=$value['type'];
- // $row['sort']=$value['sort'];
- // $arr[]=$row;
- // }
- $model=M('mp_menu');
- $model->where("mp_id={$mp['id']}")->delete();
- $model->addAll($data);
- // $this->ajaxReturn(array('error'=>false,'data'=>$arr));
- // exit;
- // $data2=$data1;
- // foreach ($data1 as $key1 => $value1) {
- // foreach ($data2 as $key2 => $value2) {
- // if($value1['id']==$value2['pid']){
- // $data1[$key1]['type']='';
- // $data1[$key1]['code']='';
- // break;
- // }
- // }
- // unset($data1[$key1]['sort']);
- // if($value['type']='event'){
- // $value['type']=$value['code'];
- // $value['code']='k_'.rand(100,999);
- // }
- // }
- include APP_PATH.'LaneWeChat/lanewechat.php';
- $ret= Menu::setMenu($data);
- if($ret===true){
- $this->ajaxReturn(array('msg'=>'创建菜单成功'));
- }else{
- $this->ajaxReturn(array('msg'=>$ret));
- }
- // file_put_contents('menu.txt',$ret);
- // $this->ajaxReturn($ret);
- }
- public function downmenu(){
- $mp = getCurrentMp();
- // print_r($mp);
- // exit;
- $mp_id = $mp['id'];
- include APP_PATH . 'LaneWeChat/lanewechat.php';
- $menu = Menu::getMenu($data);
- // print_r($menu);
- // exit;
- // print_r($menu['menu']['button']);
- // exit;
- $menu = $menu['menu']['button'];
- $arr = array();
- $index = 1;
- foreach ($menu as $key => &$value) {
- $value['mp_id']= $mp_id;
- $value['index'] = $index;
- $value['pindex'] = 0;
- $value['sort'] = $index;
- if(!empty($value['sub_button'])){
- $value['type'] = '';//设置一级菜单,默认值
- $value['content'] = '';//设置一级菜单,默认值
- $sub_menu = $value['sub_button']; //把二级菜单入到变量$sub_menu
- unset($value['sub_button']);
- $arr[] = $value;
- $subindex = 1;
- foreach ($sub_menu as $subkey=>&$subvalue) {
- $subvalue['mp_id'] = $mp_id;
- $subvalue['index'] = $index . $subindex;
- $subvalue['pindex'] = $index;
- $subvalue['sort'] = $subindex;
- if($subvalue['type']== 'click'){
- $subvalue['content'] = $subvalue['key'];
- unset($subvalue['key']);
- }else if($subvalue['type']=='view'){
- $subvalue['content'] = $subvalue['url'];
- unset($subvalue['url']);
- }else {
- $subvalue['content'] = $subvalue['type'];
- $subvalue['type'] = 'event';
- unset($subvalue['key']);
- }
- unset($subvalue['sub_button']);
- $arr[] = $subvalue;
- $subindex++;
- }
- }else{
- if($value['type']== 'click'){
- $value['content'] = $value['key'];
- unset($value['key']);
- }else if($value['type']=='view'){
- $value['content'] = $value['url'];
- unset($value['url']);
- }else {
- $value['content'] = $value['type'];
- $value['type'] = 'event';
- unset($value['key']);
- }
- unset($value['sub_button']);
- $arr[] = $value;
- }
- $index++;
- }
- // print_r($arr);
- // exit;
- $model = M('mp_menu');
- $model->where("mp_id={$mp['id']}")->delete();
- foreach ($arr as $key => $value) {
- $model->add($value);
- }
- $this->redirect('index');
- }
- public function delmenu(){
- // $mp=getCurrentMp();
- // include APP_PATH . 'LaneWeChat/lanewechat.php';
- // $menu = Menu::delMenu($data);
- // $this->display('index');
- $mp = getCurrentMp();
- $mp_id = $mp['id'];
- // print_r($mp_id);
- // exit;
- include APP_PATH . 'LaneWeChat/lanewechat.php';
- $menu = \LaneWeChat\Core\Menu::delMenu();
- // print_r($menu);
- // exit;
- $model = M('mp_menu');
- $ret=$model->where("mp_id={$mp['id']}")->delete();
- if($ret){
- $this->success('删除成功');
- }else{
- $this->error('删除失败');
- }
- }
- }