本文 介绍的是如何生成微信 带参数的二维码, 扫描关注以后推送消息,已经关注的 扫描以后 推送消息
逻辑流程是,在Force.com 里Campaign 的 创建一个记录,生成带参数的二维码参数是Campaign ID
新建一个对象WeChatMsgTemplate用来存储推送消息的模板,并创建LookUp的关系到Campaign
扫描二维码自动查询到Campaign 对应的WeChatMsgTemplate 推送多条信息。
首先 生成二维码 文档链接。 生成二维码首先要有Token 生成Token 文档链接
逻辑流程是,在Force.com 里Campaign 的 创建一个记录,生成带参数的二维码参数是Campaign ID
新建一个对象WeChatMsgTemplate用来存储推送消息的模板,并创建LookUp的关系到Campaign
扫描二维码自动查询到Campaign 对应的WeChatMsgTemplate 推送多条信息。
首先 生成二维码 文档链接。 生成二维码首先要有Token 生成Token 文档链接
如果编程中遇到 Http请求没有发送成功 检查Remote Site Settings
以下是 生成Token的代码
private static string appId = 'xxx';
private static String app_secret = 'xxxx';
public static String GetToken(){
string url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET';
url = url.replace('APPID', appId).replace('APPSECRET', app_secret);
HttpRequest req = new HttpRequest();
HttpResponse res = new HttpResponse();
Http http = new Http();
req.setEndpoint(url);
req.setMethod('GET');
res = http.send(req);
ReturedToken result = (ReturedToken) Json.deserialize(res.getBody(), ReturedToken.class);
return result.access_token;
}
ReturedToken 对象是 通过Json工具自动创建的
填写Json 自动生成类 和测试类http://json2apex.herokuapp.com/
生成Ticket 代码
public static String GetTicket(String Token,String scene_str){
string url = 'https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN';
url = url.replace('TOKEN', Token);
HttpRequest req = new HttpRequest();
HttpResponse res = new HttpResponse();
Http http = new Http();
req.setEndpoint(url);
//system.debug('url:' + url);
req.setMethod('POST');
//req.setHeader('Content-Type', 'text/xml');
req.setBody('{"action_name": "QR_LIMIT_STR_SCENE", "action_info": {"scene": {"scene_str": " ' + scene_str + ' "}}}');
res = http.send(req);
ReturedTicket TK = (ReturedTicket) Json.deserialize(res.getBody(), ReturedTicket.class);
return TK.Ticket;
}
最后生成二维码
public static String CreateQRcode (String scence){
String token = GetToken();
String url = 'https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET';
String Ticket = GetTicket(token, scence);
url = url.replace('TICKET', Ticket);
return url;
}
每一次扫描二维码 都会发送一个POST的请求到接口信息配置的URL里
这里创建先一个global 类
@RestResource(urlMapping='/WeChat/*')
global with sharing class WeChatWebservice{
@HttpGet
global static void doGet(){
String signature = RestContext.request.params.get('signature');
//String msg_signature = RestContext.request.params.get('msg_signature');
String timestamp = RestContext.request.params.get('timestamp');
String nonce = RestContext.request.params.get('nonce');
String echostr = RestContext.request.params.get('echostr');
System.debug('signature: ' + signature + '==========');
//System.debug('msg_signature: ' + msg_signature + '==========');
System.debug('timestamp: ' + timestamp + '==========');
System.debug('nonce: ' + nonce + '==========');
System.debug('echostr: ' + echostr + '==========');
RestContext.response.addHeader('Content-Type', 'text/plain');
RestContext.response.responseBody = Blob.valueOf(echostr);
}
@HttpPost
global static void doPost(){
RestRequest req = RestContext.request;
String msg = req.requestBody.toString();
//system.debug('msg: ' + msg);
WeChatRequest wReq = new WeChatRequest(msg);
//system.debug('wReq: ' + wReq);
if(wReq.getEventType() == 'SCAN') {
String CampaignID = wReq.getClickKey().trim();
String UserName = wReq.getFromUser().trim();
WeChatGetToken.WeChatMsg(CampaignID, UserName);
}
if(wReq.getEventType() == 'subscribe') {
//字符串截取
String temp = wReq.getClickKey().substringAfter('qrscene_');
system.debug('temp:' + temp);
String CampaignID = temp.trim();
String UserName = wReq.getFromUser().trim();
WeChatGetToken.WeChatMsg(CampaignID, UserName);
}
}
}
接下来创建站点
微信端的URL 配置
https://wechattony-developer-edition.ap2.force.com/services/apexrest/WeChat
站点名称 + /services/apexrest/ + global 的方法名称
发送消息到微信的方法
public static void WeChatMsg(String CampID, String OpenID){
Campaign camp = new Campaign();
camp = [SELECT name,(SELECT id,title__c, description__c, url__c, picurl__c from WeChatMsgTemplate__r) from Campaign where id =: CampID.trim()];
//system.debug('WeChatMsgTemplate__r:'+ camp.WeChatMsgTemplate__r);
if(camp != null){
List<WeChatMsgTemplate__c> WMsg = new List<WeChatMsgTemplate__c>();
WMsg = camp.WeChatMsgTemplate__r;
//system.debug('WMsg:'+ WMsg);
WeChatMsgTemplate temp = new WeChatMsgTemplate();
//List<WeChatMsgTemplate.Articles> artList = new List<WeChatMsgTemplate.Articles>();
for(WeChatMsgTemplate__c m :WMsg){
WeChatMsgTemplate.Articles art = new WeChatMsgTemplate.Articles();
art.title = m.title__c;
art.description = m.description__c;
art.url = m.url__c;
art.picurl = m.picurl__c;
temp.News.articles.add(art);
//system.debug('art:'+ art);
}
temp.touser = OpenID;
temp.msgtype = 'news';
String CampJson = JSON.serialize(temp);
//system.debug('CampJson'+ CampJson);
String Token = GetToken();
string url = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN';
url = url.replace('ACCESS_TOKEN', Token);
HttpRequest req = new HttpRequest();
HttpResponse res = new HttpResponse();
Http http = new Http();
req.setEndpoint(url);
req.setMethod('POST');
//String JSONString = JSON.serialize(ul);
//system.debug('JSONString:' + JSONString);
req.setBody(CampJson);
res = http.send(req);
}
}
WeChatRequest 这个不是我写的方法 就不公开了 各位就发挥自己的想象去接受请求 处理请求就好了
写了这么多 希望对大家有帮助。如果发现有的类不存在 那就是通过工具 复制json对象创建的类 上面有介绍
有问题可以在下面留言