java微信公众号开发案例

微信公众号开发一般是针对企业和组织的,个人一般只能申请订阅号,并且调用的接口有限,下面我们就来简单的描述下接入公众号的步骤

1、首先你需要一个邮箱在微信公众号平台进行注册;
     注册的方式有订阅号、公众号、小程序和企业号,个人我们这里只能选择订阅号

2、注册完后,我们登录到公众号平台--->开发--->基本配置,这里需要填写URL和token,URL就是我们使用服务器的接口;

3、Java Web服务器程序编译好且在服务器上部署可以运行的话,可在微信公众号进行在线接口调试:

1)、选择合适的接口
    2)、系统会生成该接口的参数表,您可以直接在文本框内填入对应的参数值(红色星号表示该字段必填)
    3)、点击检查问题按钮,即可得到相应的调试信息

eg:获取access_token的步骤:

1)、接口类型:基础支持
   2)、接口列表:获取access_token接口/token
   3)、填写相应的参数:grant_type、appid、secret
   4)、点击检查问题
   5)、验证成功会返回结果和提示,结果为:200 ok,提示:Request successful即表示验证成功

我们这里验证比较多的是消息接口调试:文本消息、图片消息、语音消息、视频消息、etc

4、接口有不理解的地方,可进入开发-->开发者工具-->开发者文档进行查询

5、接口权限:订阅号主要有基础支持、接收消息及网页服务里面的一些接口

下面我们主要讲订阅号怎么样接收消息的案例:

1、需要申请一个个人微信订阅号
2、url服务器和服务器端代码部署(可以用腾讯云or阿里云服务器)

1)、AccountsServlet.java类,验证来自微信服务器和微信服务器的消息处理

package cn.jon.wechat.servlet; 

import java.io.IOException;
import java.io.PrintWriter; 

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; 

import cn.jon.wechat.service.AccountsService;
import cn.jon.wechat.utils.SignUtil; 

public class AccountsServlet extends HttpServlet { 

 public AccountsServlet() {
 super();
 } 

 public void destroy() {
 super.destroy();
 // Put your code here
 }
 /**
 * 确认请求来自于微信服务器
 */ 

 public void doGet(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
 System.out.println("接口测试开始!!!");
 //微信加密签名
 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;
// response.encodeRedirectURL("success.jsp"); 

 }
 /**
 * 处理微信服务器发来的消息
 */
 public void doPost(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
 //消息的接受、处理、响应
 request.setCharacterEncoding("utf-8");
 response.setCharacterEncoding("utf-8");
 //调用核心业务类型接受消息、处理消息
 String respMessage = AccountsService.processRequest(request); 

 //响应消息
 PrintWriter out = response.getWriter();
 out.print(respMessage);
 out.close(); 

 } 

 public void init() throws ServletException {
 // Put your code here
 } 

}

2)、SignUtil.java类,请求校验工具类,token需要和微信中填写的token一致

package cn.jon.wechat.utils; 

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; 

/**
 * 请求校验工具类
 * @author jon
 */
public class SignUtil {
 //与微信配置中的的Token一致
 private static String token = ""; 

 public static boolean checkSignature(String signature, String timestamp,
 String nonce) {
 String[] arra = new String[]{token,timestamp,nonce};
 //将signature,timestamp,nonce组成数组进行字典排序
 Arrays.sort(arra);
 StringBuilder sb = new StringBuilder();
 for(int i=0;i<arra.length;i++){
 sb.append(arra[i]);
 }
 MessageDigest md = null;
 String stnStr = null;
 try {
 md = MessageDigest.getInstance("SHA-1");
 byte[] digest = md.digest(sb.toString().getBytes());
 stnStr = byteToStr(digest);
 } catch (NoSuchAlgorithmException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }
 //释放内存
 sb = null;
 //将sha1加密后的字符串与signature对比,标识该请求来源于微信
 return stnStr!=null?stnStr.equals(signature.toUpperCase()):false;
 }
 /**
 * 将字节数组转换成十六进制字符串
 * @param digestArra
 * @return
 */
 private static String byteToStr(byte[] digestArra) {
 // TODO Auto-generated method stub
 String digestStr = "";
 for(int i=0;i<digestArra.length;i++){
 digestStr += byteToHexStr(digestArra[i]);
 }
 return digestStr;
 }
 /**
 * 将字节转换成为十六进制字符串
 */
 private static String byteToHexStr(byte dByte) {
 // TODO Auto-generated method stub
 char[] Digit = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
 char[] tmpArr = new char[2];
 tmpArr[0] = Digit[(dByte>>>4)&0X0F];
 tmpArr[1] = Digit[dByte&0X0F];
 String s = new String(tmpArr);
 return s;
 } 

 public static void main(String[] args) {
 /*byte dByte = 'A';
 System.out.println(byteToHexStr(dByte));*/
 Map<String,String> map = new ConcurrentHashMap<String, String>();
 map.put("4", "zhangsan");
 map.put("100", "lisi");
 Set set = map.keySet();
 Iterator iter = set.iterator();
 while(iter.hasNext()){
// String keyV = (String) iter.next();
 String key =(String)iter.next();
 System.out.println(map.get(key));
// System.out.println(map.get(iter.next()));
 }
 /*for(int i=0;i<map.size();i++){ 

 }*/
 }
}

3)、AccountsService.java服务类,主要是消息的请求和响应处理,并且当用户关注你的公众号的时候,可以设置默认推送消息

package cn.jon.wechat.service; 

import java.util.Date;
import java.util.Map; 

import javax.servlet.http.HttpServletRequest; 

import cn.jon.wechat.message.req.ImageMessage;
import cn.jon.wechat.message.req.LinkMessage;
import cn.jon.wechat.message.req.LocationMessage;
import cn.jon.wechat.message.req.VideoMessage;
import cn.jon.wechat.message.req.VoiceMessage;
import cn.jon.wechat.message.resp.TextMessage;
import cn.jon.wechat.utils.MessageUtil; 

/**
 * 解耦,使控制层与业务逻辑层分离开来,主要处理请求,响应
 * @author jon
 */
public class AccountsService { 

 public static String processRequest(HttpServletRequest request) {
 String respMessage = null;
 //默认返回的文本消息内容
 String respContent = "请求处理异常,请稍后尝试!";
 try {
 //xml请求解析
 Map<String,String> requestMap = MessageUtil.pareXml(request); 

 //发送方账号(open_id)
 String fromUserName = requestMap.get("FromUserName");
 //公众账号
 String toUserName = requestMap.get("ToUserName");
 //消息类型
 String msgType = requestMap.get("MsgType"); 

 //默认回复此文本消息
 TextMessage defaultTextMessage = new TextMessage();
 defaultTextMessage.setToUserName(fromUserName);
 defaultTextMessage.setFromUserName(toUserName);
 defaultTextMessage.setCreateTime(new Date().getTime());
 defaultTextMessage.setMsgType(MessageUtil.MESSSAGE_TYPE_TEXT);
 defaultTextMessage.setFuncFlag(0);
 // 由于href属性值必须用双引号引起,这与字符串本身的双引号冲突,所以要转义
 defaultTextMessage.setContent("欢迎访问<a href=\"http://blog.csdn.net/j086924\">jon的博客</a>!");
// defaultTextMessage.setContent(getMainMenu());
 // 将文本消息对象转换成xml字符串
 respMessage = MessageUtil.textMessageToXml(defaultTextMessage); 

 //文本消息
 if(msgType.equals(MessageUtil.MESSSAGE_TYPE_TEXT)){
 //respContent = "Hi,您发送的是文本消息!";
 //回复文本消息
 TextMessage textMessage = new TextMessage();
// textMessage.setToUserName(toUserName);
// textMessage.setFromUserName(fromUserName);
 //这里需要注意,否则无法回复消息给用户了
 textMessage.setToUserName(fromUserName);
 textMessage.setFromUserName(toUserName);
 textMessage.setCreateTime(new Date().getTime());
 textMessage.setMsgType(MessageUtil.MESSSAGE_TYPE_TEXT);
 textMessage.setFuncFlag(0);
 respContent = "Hi,你发的消息是:"+requestMap.get("Content");
 textMessage.setContent(respContent);
 respMessage = MessageUtil.textMessageToXml(textMessage);
 }
 //图片消息
 else if(msgType.equals(MessageUtil.MESSSAGE_TYPE_IMAGE)){ 

 ImageMessage imageMessage=new ImageMessage();
 imageMessage.setToUserName(fromUserName);
 imageMessage.setFromUserName(toUserName);
 imageMessage.setCreateTime(new Date().getTime());
 imageMessage.setMsgType(MessageUtil.MESSSAGE_TYPE_IMAGE);
 //respContent=requestMap.get("PicUrl");
 imageMessage.setPicUrl("http://img24.pplive.cn//2013//07//24//12103112092_230X306.jpg");
 respMessage = MessageUtil.imageMessageToXml(imageMessage);
 }
 //地理位置
 else if(msgType.equals(MessageUtil.MESSSAGE_TYPE_LOCATION)){
 LocationMessage locationMessage=new LocationMessage();
 locationMessage.setToUserName(fromUserName);
 locationMessage.setFromUserName(toUserName);
 locationMessage.setCreateTime(new Date().getTime());
 locationMessage.setMsgType(MessageUtil.MESSSAGE_TYPE_LOCATION);
 locationMessage.setLocation_X(requestMap.get("Location_X"));
 locationMessage.setLocation_Y(requestMap.get("Location_Y"));
 locationMessage.setScale(requestMap.get("Scale"));
 locationMessage.setLabel(requestMap.get("Label"));
 respMessage = MessageUtil.locationMessageToXml(locationMessage); 

 } 

 //视频消息
 else if(msgType.equals(MessageUtil.MESSSAGE_TYPE_VIDEO)){
 VideoMessage videoMessage=new VideoMessage();
 videoMessage.setToUserName(fromUserName);
 videoMessage.setFromUserName(toUserName);
 videoMessage.setCreateTime(new Date().getTime());
 videoMessage.setMsgType(MessageUtil.MESSSAGE_TYPE_VIDEO);
 videoMessage.setMediaId(requestMap.get("MediaId"));
 videoMessage.setThumbMediaId(requestMap.get("ThumbMediaId"));
 respMessage = MessageUtil.videoMessageToXml(videoMessage); 

 }
 //链接消息
 else if(msgType.equals(MessageUtil.MESSSAGE_TYPE_LINK)){
 LinkMessage linkMessage=new LinkMessage();
 linkMessage.setToUserName(fromUserName);
 linkMessage.setFromUserName(toUserName);
 linkMessage.setCreateTime(new Date().getTime());
 linkMessage.setMsgType(MessageUtil.MESSSAGE_TYPE_LINK);
 linkMessage.setTitle(requestMap.get("Title"));
 linkMessage.setDescription(requestMap.get("Description"));
 linkMessage.setUrl(requestMap.get("Url"));
 respMessage = MessageUtil.linkMessageToXml(linkMessage);
 }
 //语音消息
 else if(msgType.equals(MessageUtil.MESSSAGE_TYPE_VOICE)){
 VoiceMessage voiceMessage=new VoiceMessage();
 voiceMessage.setToUserName(fromUserName);
 voiceMessage.setFromUserName(toUserName);
 voiceMessage.setCreateTime(new Date().getTime());
 voiceMessage.setMsgType(MessageUtil.MESSSAGE_TYPE_VOICE);
 voiceMessage.setMediaId(requestMap.get("MediaId"));
 voiceMessage.setFormat(requestMap.get("Format"));
 respMessage = MessageUtil.voiceMessageToXml(voiceMessage);
 }
 //事件推送
 else if(msgType.equals(MessageUtil.MESSSAGE_TYPE_EVENT)){
 //事件类型
 String eventType = requestMap.get("Event");
 //订阅
 if(eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)){
  respContent = "谢谢关注!";
 }
 //取消订阅
 else if(eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)){
  //
  System.out.println("取消订阅"); 

 }
 else if(eventType.equals(MessageUtil.EVENT_TYPE_CLICK)){
  //自定义菜单消息处理
  System.out.println("自定义菜单消息处理");
 }
 } 

 } catch (Exception e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }
 return respMessage;
 } 

 public static String getMainMenu()
 {
 StringBuffer buffer =new StringBuffer();
 buffer.append("您好,我是jon,请回复数字选择服务:").append("\n");
 buffer.append("1、我的博客").append("\n");
 buffer.append("2、 歌曲点播").append("\n");
 buffer.append("3、 经典游戏").append("\n");
 buffer.append("4 、聊天打牌").append("\n\n");
 buffer.append("回复"+"0"+"显示帮助菜单");
 return buffer.toString(); 

 }
}

4)、MessageUtil.java帮助类,包括常量的定义和xml消息转换和处理

package cn.jon.wechat.utils; 

import java.io.InputStream;
import java.io.Writer;
import java.util.HashMap;
import java.util.List;
import java.util.Map; 

import javax.servlet.http.HttpServletRequest; 

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; 

import cn.jon.wechat.message.req.ImageMessage;
import cn.jon.wechat.message.req.LinkMessage;
import cn.jon.wechat.message.req.LocationMessage;
import cn.jon.wechat.message.req.VideoMessage;
import cn.jon.wechat.message.req.VoiceMessage;
import cn.jon.wechat.message.resp.Article;
import cn.jon.wechat.message.resp.MusicMessage;
import cn.jon.wechat.message.resp.NewsMessage;
import cn.jon.wechat.message.resp.TextMessage; 

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.core.util.QuickWriter;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
import com.thoughtworks.xstream.io.xml.XppDriver; 

/**
 * 各种消息的处理类
 * @author jon
 */ 

public class MessageUtil {
 /**
 * 文本类型
 */
 public static final String MESSSAGE_TYPE_TEXT = "text";
 /**
 * 音乐类型
 */
 public static final String MESSSAGE_TYPE_MUSIC = "music";
 /**
 * 图文类型
 */
 public static final String MESSSAGE_TYPE_NEWS = "news"; 

 /**
 * 视频类型
 */
 public static final String MESSSAGE_TYPE_VIDEO = "video";
 /**
 * 图片类型
 */
 public static final String MESSSAGE_TYPE_IMAGE = "image";
 /**
 * 链接类型
 */
 public static final String MESSSAGE_TYPE_LINK = "link";
 /**
 * 地理位置类型
 */
 public static final String MESSSAGE_TYPE_LOCATION = "location";
 /**
 * 音频类型
 */
 public static final String MESSSAGE_TYPE_VOICE = "voice";
 /**
 * 推送类型
 */
 public static final String MESSSAGE_TYPE_EVENT = "event";
 /**
 * 事件类型:subscribe(订阅)
 */
 public static final String EVENT_TYPE_SUBSCRIBE = "subscribe";
 /**
 * 事件类型:unsubscribe(取消订阅)
 */
 public static final String EVENT_TYPE_UNSUBSCRIBE = "unsubscribe";
 /**
 * 事件类型:click(自定义菜单点击事件)
 */
 public static final String EVENT_TYPE_CLICK= "CLICK"; 

 /**
 * 解析微信发来的请求 XML
 */
 @SuppressWarnings("unchecked")
 public static Map<String,String> pareXml(HttpServletRequest request) throws Exception { 

 //将解析的结果存储在HashMap中
 Map<String,String> reqMap = new HashMap<String, String>(); 

 //从request中取得输入流
 InputStream inputStream = request.getInputStream();
 //读取输入流
 SAXReader reader = new SAXReader();
 Document document = reader.read(inputStream);
 //得到xml根元素
 Element root = document.getRootElement();
 //得到根元素的所有子节点
 List<Element> elementList = root.elements();
 //遍历所有的子节点取得信息类容
 for(Element elem:elementList){
 reqMap.put(elem.getName(),elem.getText());
 }
 //释放资源
 inputStream.close();
 inputStream = null; 

 return reqMap;
 }
 /**
 * 响应消息转换成xml返回
 * 文本对象转换成xml
 */
 public static String textMessageToXml(TextMessage textMessage) {
 xstream.alias("xml", textMessage.getClass());
 return xstream.toXML(textMessage);
 }
 /**
 * 语音对象的转换成xml
 *
 */
 public static String voiceMessageToXml(VoiceMessage voiceMessage) {
 xstream.alias("xml", voiceMessage.getClass());
 return xstream.toXML(voiceMessage);
 } 

 /**
 * 视频对象的转换成xml
 *
 */
 public static String videoMessageToXml(VideoMessage videoMessage) {
 xstream.alias("xml", videoMessage.getClass());
 return xstream.toXML(videoMessage);
 } 

 /**
 * 音乐对象的转换成xml
 *
 */
 public static String musicMessageToXml(MusicMessage musicMessage) {
 xstream.alias("xml", musicMessage.getClass());
 return xstream.toXML(musicMessage);
 }
 /**
 * 图文对象转换成xml
 *
 */
 public static String newsMessageToXml(NewsMessage newsMessage) {
 xstream.alias("xml", newsMessage.getClass());
 xstream.alias("item", new Article().getClass());
 return xstream.toXML(newsMessage);
 } 

 /**
 * 图片对象转换成xml
 *
 */ 

 public static String imageMessageToXml(ImageMessage imageMessage)
 {
 xstream.alias("xml",imageMessage.getClass());
 return xstream.toXML(imageMessage); 

 } 

 /**
 * 链接对象转换成xml
 *
 */ 

 public static String linkMessageToXml(LinkMessage linkMessage)
 {
 xstream.alias("xml",linkMessage.getClass());
 return xstream.toXML(linkMessage); 

 } 

 /**
 * 地理位置对象转换成xml
 *
 */ 

 public static String locationMessageToXml(LocationMessage locationMessage)
 {
 xstream.alias("xml",locationMessage.getClass());
 return xstream.toXML(locationMessage); 

 } 

 /**
 * 拓展xstream,使得支持CDATA块
 *
 */
 private static XStream xstream = new XStream(new XppDriver(){
 public HierarchicalStreamWriter createWriter(Writer out){
 return new PrettyPrintWriter(out){
 //对所有的xml节点的转换都增加CDATA标记
 boolean cdata = true; 

 @SuppressWarnings("unchecked")
 public void startNode(String name,Class clazz){
  super.startNode(name,clazz);
 } 

 protected void writeText(QuickWriter writer,String text){
  if(cdata){
  writer.write("<![CDATA[");
  writer.write(text);
  writer.write("]]>");
  }else{
  writer.write(text);
  }
 }
 };
 }
 }); 

}

5)、BaseMessage.java消息基类(包括:开发者微信号、用户账户、创建时间、消息类型、消息ID变量),文本、视频、图片消息都会继承此基类,在此基础上扩展自己的变量,可根据开发者文档中的各种消息属性进行定义

package cn.jon.wechat.message.req;
/**
 * 消息基类 (普通用户-公众号)
 * @author jon
 */
public class BaseMessage { 

 //开发者微信号
 private String ToUserName;
 //发送方账号(一个openId)
 private String FromUserName;
 //消息创建时间(整型)
 private long CreateTime;
 //消息类型(text/image/location/link...)
 private String MsgType;
 //消息id 64位整型
 private String MsgId; 

 public BaseMessage() {
 super();
 // TODO Auto-generated constructor stub
 } 

 public BaseMessage(String toUserName, String fromUserName, long createTime,
 String msgType, String msgId) {
 super();
 ToUserName = toUserName;
 FromUserName = fromUserName;
 CreateTime = createTime;
 MsgType = msgType;
 MsgId = msgId;
 } 

 public String getToUserName() {
 return ToUserName;
 } 

 public void setToUserName(String toUserName) {
 ToUserName = toUserName;
 } 

 public String getFromUserName() {
 return FromUserName;
 } 

 public void setFromUserName(String fromUserName) {
 FromUserName = fromUserName;
 }
 public long getCreateTime() {
 return CreateTime;
 } 

 public void setCreateTime(long createTime) {
 CreateTime = createTime;
 }
 public String getMsgType() {
 return MsgType;
 } 

 public void setMsgType(String msgType) {
 MsgType = msgType;
 }
 public String getMsgId() {
 return MsgId;
 } 

 public void setMsgId(String msgId) {
 MsgId = msgId;
 }
}

6)、TextMessage.java文本消息,继承自5中基类,扩展内容属性

package cn.jon.wechat.message.req;
/**
 * 文本消息
 * @author jon
 */
public class TextMessage extends BaseMessage{
 //消息内容
 private String content; 

 public String getContent() {
 return content;
 } 

 public void setContent(String content) {
 this.content = content;
 } 

}

7)、ImageMessage.java图片消息

package cn.jon.wechat.message.req;
/**
 * 图片消息
 * @author jon
 */
public class ImageMessage extends BaseMessage{
 //图片链接
 private String PicUrl; 

 public String getPicUrl() {
 return PicUrl;
 } 

 public void setPicUrl(String picUrl) {
 PicUrl = picUrl;
 }
} 

8)、VideoMessage.java视频消息

package cn.jon.wechat.message.req; 

public class VideoMessage extends BaseMessage { 

 private String mediaId;
 private String thumbMediaId;
 public String getMediaId() {
 return mediaId;
 }
 public void setMediaId(String mediaId) {
 this.mediaId = mediaId;
 }
 public String getThumbMediaId() {
 return thumbMediaId;
 }
 public void setThumbMediaId(String thumbMediaId) {
 this.thumbMediaId = thumbMediaId;
 } 

} 

其他消息类可根据开发者文档自行进行完成,另外,开发者也可以申请公众平台测试账号,对开发的相关内容进行测试。

本文已被整理到了《Android微信开发教程汇总》,《java微信开发教程汇总》欢迎大家学习阅读。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java微信公众号开发(搭建本地测试环境)

    俗话说,工欲善其事,必先利其器.要做微信公众号开发,两样东西不可少,那就是要有一个用来测试的公众号,还有一个用来调式代码的开发环境. 测试公众号 微信公众号有订阅号.服务号.企业号,在注册的时候看到这样的信息,只有订阅号可以个人申请,服务号和企业号要有企业资质才可以.这里所说的微信公众号开发指的是订阅号和服务号. 另外,未认证的个人订阅号有一些接口是没有权限的,并且目前个人订阅号已不支持微信认证,也就是说个人订阅号无法调用一些高级的权限接口,下图就是一个未认证的个人订阅号所具备权限列表,像生成二

  • 第三方网站微信登录java代码实现

    前两个星期在公司中的项目加上了微信登录.绑定的功能,在这里做个记录! 一.开发前知识 1.微信开放平台与微信公众平台的区别 1.1 微信公众平台: ① 地址:https://mp.weixin.qq.com/cgi-bin/loginpage?t=wxm2-login&lang=zh_CN ② 微信公众平台面向的是普通的用户,比如自媒体和媒体,企业官方微信公众账号运营人员使用,当然你所在的团队或者公司有实力去开发一些内容,也可以调用公众平台里面的接口,比如自定义菜单,自动回复,查询功能. 1.2

  • Java实现仿微信红包分配规则

    最近过年发红包拜年成为一种新的潮流,作为程序猿对算法的好奇远远要大于对红包的好奇,这里介绍一种自己想到的一种随机红包分配策略,还请大家多多指教. 算法介绍 一.红包金额限制 对于微信红包,我们知道没人随机的最小红包是1分,最大金额是200元,这里我们同样来设置红包的范围,下面代码我们统一金钱的单位为分. //最小红包额度 private static final int MINMONEY = 1; //最大红包额度 private static final int MAXMONEY = 200

  • 微信java开发之实现微信主动推送消息

    1.拉取access_token2.拉取用户信息3.主动推送消息4.接口貌似要申请权限5.依赖httpclient4.2.3 和jackson 2.2.1 复制代码 代码如下: public class WeixinAPIHelper { /**  * 获取token接口  */ private String getTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=

  • java实现微信支付(服务端)

    废话不多说,直接看代码. RequestHandler requestHandler = new RequestHandler(super.getRequest(),super.getResponse()); //获取token //两小时内有效,两小时后重新获取 Token = requestHandler.GetToken(); //更新token 到应用中 requestHandler.getTokenReal(); System.out.println("微信支付获取token=====

  • Java通过JsApi方式实现微信支付

    要使用JsApi进行微信支付,首先要从微信获得一个prepay_id,然后通过调用微信的jsapi完成支付,JS API的返回结果get_brand_wcpay_request:ok仅在用户成功完成支付时返回.由于前端交互复杂,get_brand_wcpay_request:cancel或者get_brand_wcpay_request:fail可以统一处理为用户遇到错误或者主动放弃,不必细化区分. 示例代码如下: function onBridgeReady(){ WeixinJSBridge

  • Java编程调用微信分享功能示例

    本文实例讲述了Java编程调用微信分享功能.分享给大家供大家参考,具体如下: 这篇文章介绍如何使用java开发微信分享功能,因为工作,已经开发完成,可使用. 如果想要自定义微信的分享功能,首先在自己的页面内首先使用AJAX.下面我具体举例. 首先是在页面内写入请求后台的AJAX /** * 调用微信分享接口 * */ public void WXConfig(){ String url = getPara("href"); WXConfigController scan = new W

  • java实现微信公众平台自定义菜单的创建示例

    复制代码 代码如下: import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL; import org.json.JSONObject; public class MenuUtil { /**  * 获得ACC

  • java开发微信分享到朋友圈功能

    微信分享功能开发 用了一天时间,把微信发送给朋友和分享到朋友圈功能开发出来,在这里给大家分享一下,避免大家走弯路. 一.服务器端程序 package com.wiimedia.controller; import java.io.IOException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.text.ParseException; import

  • Java开发微信公众号接收和被动回复普通消息

    上篇说完了如何接入微信公众号,本文说一下微信公众号的最基本功能:普通消息的接收和回复.说到普通消息,那么什么是微信公众号所定义的普通消息呢,微信开发者文档中提到的接收的普通消息包括如下几类: 1.文本消息 2.图片消息 3.语音消息 4.视频消息 5.小视频消息 6.地理位置消息 7.链接消息(被动回复的消息) 被动回复的普通消息包括: 1.回复文本消息 2.回复图片消息 3.回复语音消息 4.回复视频消息 5.回复音乐消息 6.回复图文消息 其实接收消息和被动回复消息这两个动作是不分家的,这本

  • 微信支付H5调用支付详解(java版)

    最近项目需要微信支付,然后看了下微信公众号支付,,虽然不难,但是细节还是需要注意的,用了大半天时间写了个demo,并且完整的测试了一下支付流程,下面分享一下微信公众号支付的经验. 一.配置公众号微信支付  需要我们配置微信公众号支付地址和测试白名单. 比如:支付JS页面的地址为 http://www.xxx.com/shop/pay/ 那此处配置www.xxx.com/shop/pay/ 二.开发流程 借用微信公众号支付api(地址 http://pay.weixin.qq.com/wiki/d

  • java开发微信公众号支付

    最近做了微信公众号支付的开发,由于是第一次做也摸索了几天的时间,也只是达到了实现功能的水平,并没有太多考虑到性能问题,所以这篇文章比较适合初学者. 微信公众号支付的总体其实很简单,大致就分为三步.第一步需要获取用户授权:第二步调用统一下单接口获取预支付id:第三步H5调起微信支付的内置的js.下面介绍具体每一步的开发流程. 一    首先要明确微信公众号支付属于网页版支付,所以相较于app的直接调取微信支付要多一步微信授权.也就是需要获取用户的openid.微信公众号使用的交易类型是JSAPI,

随机推荐