Force.com微信开发系列 WeChat 扫描带参数二维码事件

本文 介绍的是如何生成微信 带参数的二维码, 扫描关注以后推送消息,已经关注的 扫描以后 推送消息


逻辑流程是,在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对象创建的类 上面有介绍

有问题可以在下面留言


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值