使用微信登录

一、材料

微信公众平台:https://mp.weixin.qq.com/

微信开发文档:https://mp.weixin.qq.com/wiki/home/

 

二、准备

1.使用测试号,企业号需要申请有接口权限等问题,开发者可以使用测试账号。

095212_ZdsI_2341969.png

095417_QviJ_2341969.png

 

095519_ptz6_2341969.png

 

095552_aTf5_2341969.png

三、开发

1.创建一个web工程

095757_kRJI_2341969.png

 

2.新建web.xml

<?xml version="1.0"?>
<web-app     xmlns="http://xmlns.jcp.org/xml/ns/javaee"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
 
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_0.xsd"
 
            version="3.0">
 
    <welcome-file-list>
        <welcome-file>/WelcomeServlet</welcome-file>
         <welcome-file>/WelcomeServlet</welcome-file>
    </welcome-file-list>
    <!-- PC登录   -->
    <servlet>
        <servlet-name>WelcomeServlet</servlet-name>
        <servlet-class>com.kakasys.servlet.WelcomeServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>WelcomeServlet</servlet-name>
        <url-pattern>/WelcomeServlet</url-pattern>
    </servlet-mapping>
    <!-- 微信登录   -->
    <servlet>
        <servlet-name>WeChatServlet</servlet-name>
        <servlet-class>com.kakasys.servlet.WeChatServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>WeChatServlet</servlet-name>
        <url-pattern>/WeChatServlet</url-pattern>
    </servlet-mapping>
 
</web-app>

 

3.新建 servlet , WelcomeServlet pc 端返回二维码显示到登录首页、 WeChatServlet微信登录校验。

package com.kakasys.servlet;
 
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;

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

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.kakasys.utils.QRcodeUtil;

import sun.misc.BASE64Encoder;
 
public class WelcomeServlet extends HttpServlet {
 
    /**@description 描述:pc 端返回二维码显示到登录首页
	 * @date 创建时间:2017年4月13日 下午6:52:53?
	 * @author? 作者 : 周壮
	 */
	private static final long serialVersionUID = 1L;
	private static Log log = LogFactory.getLog(WelcomeServlet.class);
    
    @Override
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
    	
        response.setContentType("text/html;charset=UTF-8");
        
        System.out.println("enter WelcomeServlet...");
		
        String imgpath = "/img/qrcode/";
		
		int wechatid =  (int)(Math.random()*100000000);
		System.out.println("===============================发发发===========wechatid" + wechatid);
		String ewm_str = "http://192.168.2.73:8080/MyServlet/WeChatServlet?id=" + wechatid;
		
		File file =new File(imgpath); 
		//如果文件夹不存在则创建    
		if  (!file.exists()  && !file.isDirectory()){       
		    file.mkdir(); 
		    file.getParentFile().mkdirs();
		}
		System.out.println("WelcomeServlet qrcode " + ewm_str);
		QRcodeUtil.keygenQRcode(imgpath + File.separator + wechatid + ".png", ewm_str, 250, 250);
		byte[] data = null;
		System.out.println("WelcomeServlet qrcode " + data);
		// 获取生产的二维码图片
		// 读取图片字节数组
		try {
			InputStream in = new FileInputStream(imgpath + File.separator + wechatid + ".png");
			data = new byte[in.available()];
			in.read(data);
			in.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		// 对字节数组Base64编码
		BASE64Encoder encoder = new BASE64Encoder();
		System.out.println("WelcomeServlet qrcode " + data);
		String qrcode = encoder.encode(data);// 返回Base64编码过的字节数组字符串
		
		System.out.println("WelcomeServlet qrcode " + qrcode);
        PrintWriter out = response.getWriter();
		try {
			try {
				// Write some content
				out.println("<html>");
				out.println("<head>");
				out.println("<title>登录</title>");
				out.println("</head>");
				out.println("<body>");
				//二维码
				out.println("<h1><center>欢迎登录</center></h1>");
				out.println("<center><img   style=\"width : 30% \"; src=\"data:image/png;base64,"+qrcode+"\"/></center>");
				out.println("</body>");
				out.println("</html>");

			} finally {
				out.close();
			}
	        
		} catch (Exception e) {
			
			  System.out.println("WelcomeServlet getCode Exception " + e);
		}
		
    }
 
    @Override
    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        //Do some other work
    }
 
    @Override
    public String getServletInfo() {
        return "WelcomeServlet";
    }
}

4.微信登录校验

package com.kakasys.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 org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.kakasys.utils.WxApi;
 
public class WeChatServlet extends HttpServlet {
 
    /**@description 描述:微信登录校验
	 * @date 创建时间:2017年4月13日 下午6:53:05?
	 * @author? 作者 : 周壮
	 */
	private static final long serialVersionUID = 1L;

	private static Log log = LogFactory.getLog(WeChatServlet.class);
    
    //测试账号
    protected final static String AppID = "wx8d9ed8df25ea8861";
	protected final static String AppSecret = "f9064434b33ec786a6e8fe8ea79f8430";
	protected final static String host = "http://192.168.2.73:8080/MyServlet";
    @Override
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
    	
        response.setContentType("text/html;charset=UTF-8");
        
        log.debug("enter WeChatServlet...");
		
		WxApi wechat = new WxApi();
		
		String id = request.getParameter("id");
		String code = request.getParameter("code");
		
		PrintWriter out = response.getWriter();
		if (null == code || "" == code) {
			
			try {
	
				String redirect_uri = host + "/WeChatServlet?id=" + id;
				//redirect_uri = URLEncoder.encode(redirect_uri, "UTF-8");
				StringBuffer url = new StringBuffer();
				url.append("https://open.weixin.qq.com/connect/oauth2/authorize?appid=");
				url.append(AppID);
				url.append("&redirect_uri=");
				url.append(redirect_uri);
				url.append("&response_type=code&scope=snsapi_base&state=1#wechat_redirect");
				log.debug("url:   " + url);

				response.sendRedirect(url.toString());
		        
			} catch (Exception e) {
				
				  log.debug("WeChatServlet getCode Exception " + e);
				  
				  try {
						// Write some content
						// Write some content
						out.println("<html>");
						out.println("<head>");
						out.println("<title>登录异常</title>");
						out.println("</head>");
						out.println("<body>");
						out.println("<h1><center>登录异常" + e + "</center></h1>");
						out.println("</body>");
						out.println("</html>");
					} finally {
						out.close();
					}
			}
		} else {
			
			try {
				String openid = wechat.getOpenId(code);
				
				log.debug("openid:   " + openid);
				
		        try {
 
		        	// Write some content
		            out.println("<html>");
		            out.println("<head>");
		            out.println("<title>登录成功</title>");
		            out.println("</head>");
		            out.println("<body>");
		            out.println("<br><br><h1><center>登录成功</center></h1><br>");
		            out.println("<h1><center>你的openid是" + openid + "</center></h1>");
		            out.println("</body>");
		            out.println("</html>");
		        } finally {
		            out.close();
		        }
		        
			} catch (Exception e) {

				log.debug("WeChatServlet getCode Exception " + e);
				try {
					// Write some content
					out.println("<html>");
					out.println("<head>");
					out.println("<title>登录异常</title>");
					out.println("</head>");
					out.println("<body>");
					out.println("<h1><center>登录异常" + e + "</center></h1>");
					out.println("</body>");
					out.println("</html>");
				} finally {
					out.close();
				}
			}
		}
    }
 
    @Override
    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        //Do some other work
    }
 
    @Override
    public String getServletInfo() {
        return "WeChatServlet";
    }
}

 

5.工具类 HttpUtil.class 、 QRcodeUtil.class 、 WxAccessToken.class 、 WxApi.class

package com.kakasys.utils;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import okhttp3.Headers;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class HttpUtil {
	public static final String UTF8 = "UTF-8";
	public static final String GBK = "GBK";
	public static final String GB2312 = "GB2312";
	public static final String ISO8859_1 = "ISO8859-1";
	public static final String user_agent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36";
	public static final String user_agent_wechat = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36";

	public static int connectTimeout = 60;
	public static int readTimeout = 30;
	public static int writeTimeout = 60;

	private static final Log log = LogFactory.getLog(HttpUtil.class);
	
	protected static OkHttpClient client = new OkHttpClient.Builder()
			.connectTimeout(connectTimeout, TimeUnit.SECONDS).readTimeout(readTimeout, TimeUnit.SECONDS)
			.writeTimeout(writeTimeout, TimeUnit.SECONDS).build();
	
	public Object post(String url, Map<String, String> params, String charset) {
		log.info("post "+url+" starting...");
		HttpClient httpclient = null;
		HttpPost post = null;
		String responseText = "";
		try {
			httpclient = new DefaultHttpClient();
			post = new HttpPost(url);
			UrlEncodedFormEntity entity = new UrlEncodedFormEntity(getParams(params));
			post.setEntity(entity);
			log.info("httpclient executing...");
			HttpResponse response = httpclient.execute(post);
			log.info("httpclient executed.");
			int status = response.getStatusLine().getStatusCode();
			log.info(">>>HttpStatus:" + status);
			if (status == HttpStatus.SC_OK) {
				responseText = EntityUtils.toString(response.getEntity(), UTF8);
			} else {
				System.out.println("执行检测业务信息失败,网络错误或配置文件出错.");
			}
			log.info("==========================post "+url+" over==================================");
		} catch (Exception e) {
			log.error("request "+url+" exception!!!", e);
		} finally {
			if (post != null)
				post.abort();
			if (httpclient != null)
				httpclient.getConnectionManager().shutdown();
		}
		return responseText;
	}
	
	
	/**
	 * 参数转换,将map转为list中存放NameValuePair
	 * @param map
	 * @return 转换完毕的
	 */
	private List<NameValuePair> getParams(Map<String,String> map){
		List<NameValuePair> param = new ArrayList<NameValuePair>();
		for(String key:map.keySet())	{
			param.add(new BasicNameValuePair("dateparam", map.get(key)));
		}
		return param;
	}

	public static String post(String string, String params, Object charset) {
		// TODO Auto-generated method stub
		return null;
	}


	public static String get(String url, Map<String, String> headers) {
		String responseBody = "";
		try {
			Request.Builder reqBuild = new Request.Builder();
			if (headers != null) {
				headers.put("User-Agent", user_agent);
				reqBuild.headers(Headers.of(headers));
			} else {
				reqBuild.addHeader("User-Agent", user_agent);
			}
			Request request = reqBuild.url(url).build();
			Response response = client.newCall(request).execute();
			responseBody = response.body().string();
			log.info("responseBody" + responseBody);
			response.close();
		} catch (IOException e) {
			log.error("", e);
		}
		return responseBody;
	}


	public static String postSSL(String url, String string, String cert, String certpassword) {
		// TODO Auto-generated method stub
		return null;
	}
}

 

package com.kakasys.utils;


import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;

import javax.imageio.ImageIO;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.Result;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.kakasys.common.CreateID;


/***
 * 二维码生成工具类
 * 
 */
public class QRcodeUtil {
	private static final Log LOG = LogFactory.getLog(QRcodeUtil.class);
	
	private static final String SUFFIX = "png";// 后缀
	private static final String FILE_TYPE = "png";
	

	public QRcodeUtil() {
		
	}


	/***
	 * 生成单个二维码
	 * 
	 * @param filePath
	 *            文件路径
	 * @param content
	 *            二维码内容
	 * @param hints
	 *            生成条件的设置
	 * @param width 
	 *            宽
	 * @param heigh
	 *            高度
	 */

	public static void keygenQRcode(String filePath, String content,int width,int heigh) {

		try {
			MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
			Map hints = new Hashtable();
			
			//将二维码容错率设置为最高
			hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
			//设置二维码边界大小为1
			hints.put(EncodeHintType.MARGIN, 1);
			//设置二维码字符集为UTF-8
			hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
			if (content != null && content.length() > 0) {
				BitMatrix bitMatrix = multiFormatWriter.encode(content,
						BarcodeFormat.QR_CODE, width, heigh, hints);
				BitMatrix noWhiteBitMatrix = deleteWhite(bitMatrix);
				
				File drFile = new File(filePath);
				MatrixToImageWriter.writeToFile(noWhiteBitMatrix, FILE_TYPE, drFile);

			}
		} catch (WriterException e) {
			LOG.error("keygenQRcode writer file error",e);
		} catch (IOException e) {
			LOG.error("keygenQRcode IO error",e);
		}
	}
	/***
	 * 二维码去白边
	 * @param matrix
	 * @return
	 */
	public static BitMatrix deleteWhite(BitMatrix matrix){
		int[] rec = matrix.getEnclosingRectangle();
		int resWidth = rec[2] + 1;
		int resHeight = rec[3] + 1;

		BitMatrix resMatrix = new BitMatrix(resWidth, resHeight);
		resMatrix.clear();
		for (int i = 0; i < resWidth; i++) {
			for (int j = 0; j < resHeight; j++) {
				if (matrix.get(i + rec[0], j + rec[1]))
					resMatrix.set(i, j);
			}
		}
		return resMatrix;
	}
	
    public String addleft(String val, int len)
    {
        for(; val.length() < len; val = (new StringBuilder("#")).append(val).toString());
        return val;
    }
	
	
	@SuppressWarnings({ "unused", "unchecked", "rawtypes" })
	private static String keygenQRencode(String path) {

		String text = "";
		try {
            MultiFormatReader formatReader = new MultiFormatReader();
            File file = new File(path);
            BufferedImage image = ImageIO.read(file);
            BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image)));
             
            //定义二维码的参数
            HashMap hints = new HashMap();
            hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
            Result result = formatReader.decode(binaryBitmap,hints);

            text =  result.getText();
            
            LOG.debug(text);
            
        } catch (Exception e) {
            e.printStackTrace();
        }
		return text;

	}
	
	public static void main(String[] args){

		String imgpath = "/img/qrcode/";
		String wechatid =  CreateID.I().CreateCheckID("hs_wechat");
		System.out.println("=================================================wechatid" + wechatid);
		String ewm_str = "https://oa.kakasys.com:8443/?id=" + wechatid;
		QRcodeUtil.keygenQRcode(imgpath + File.separator + wechatid + ".png", ewm_str, 250, 250);
		
	}

}

 

package com.kakasys.utils;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.kakasys.common.Param;

import net.sf.json.JSONObject;


public class WxAccessToken {
	private static Log log = LogFactory.getLog(WxAccessToken.class);
	protected final static String AppID = Param.getValue("WX", "AppID");
	protected final static String AppSecret = Param.getValue("WX", "AppSecret");

	/**
	 * 获取access_token 不能再同一个类中调用被注解缓存了的方法
	 */
	public static String getAccess_token() {
		StringBuffer url = new StringBuffer();
		url.append("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=").append(AppID);
		url.append("&secret=").append(AppSecret);
		log.debug("微信公众号请求信息:" + url.toString());
		String resp_str = HttpUtil.get(url.toString(), null);
		log.debug("微信公众号返回信息:" + resp_str);
		return JSONObject.fromObject(resp_str) == null ? "" : JSONObject.fromObject(resp_str).getString("access_token");
	}

	public static String getTicket() {
		String ticket = null;
		String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + getAccess_token()
				+ "&type=jsapi";// 这个url链接和参数不能变
		String message = HttpUtil.get(url.toString(), null);
		JSONObject demoJson = JSONObject.fromObject(message);
		log.debug("微信公众号返回信息:" + demoJson);
		ticket = demoJson.getString("ticket");
		return ticket;
	}
}

 

package com.kakasys.utils;

import java.io.UnsupportedEncodingException;
import java.util.Set;
import java.util.UUID;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.kakasys.common.Param;

import net.sf.json.JSONObject;


/**
 * 微信api
 * 
 * @author zwx
 *
 */
public class WxApi {
	private static Log log = LogFactory.getLog(WxApi.class);
	protected final static String AppID = "wx8d9ed8df25ea8861";
	protected final static String AppSecret = "f9064434b33ec786a6e8fe8ea79f8430";

	/**
	 * 获取隐形授权的code
	 * 
	 * @throws UnsupportedEncodingException
	 */
	public String getCode() throws UnsupportedEncodingException {
		String redirect_uri = "http://192.168.2.73:8080/IBank/wechat/wechatlogin.do?id=123";
		//redirect_uri = URLEncoder.encode(redirect_uri, "UTF-8");
		StringBuffer url = new StringBuffer();
		url.append("https://open.weixin.qq.com/connect/oauth2/authorize?appid=");
		url.append(AppID);
		url.append("&redirect_uri=");
		url.append(redirect_uri);
		url.append("&response_type=code&scope=snsapi_base&state=123#wechat_redirect");
		log.debug("url:   " + url);
		return  url.toString();
	}

	/**
	 * 微信隐形授权返回code,使用code去查询openid
	 * 
	 * @param code
	 * @return
	 */
	public String getOpenId(String code) {
		// 1.通过code换取网页授权access_token
		StringBuffer url = new StringBuffer();
		url.append("https://api.weixin.qq.com/sns/oauth2/access_token?appid=").append(AppID);
		url.append("&secret=").append(AppSecret);
		url.append("&code=").append(code);
		url.append("&grant_type=authorization_code");
		String resp_str = HttpUtil.get(url.toString(), null);
		log.debug("网页授权获取code微信公众号返回信:" + resp_str);
		JSONObject codeResp = JSONObject.fromObject(resp_str);
		String openid = codeResp.optString("openid", "");
		return openid;
	}

	/**
	 * 判断用户是否关注
	 * 
	 * @param openId
	 * @return true :关注�? false 没关�?
	 */
	public boolean IsConcern(String openId) {
		// 判断用户是否关注公众�? subscribe:0表示你还没关注这个公众号�?1表示你已经关注了
		StringBuffer url = new StringBuffer();
		url.append("https://api.weixin.qq.com/cgi-bin/user/info?access_token=").append(WxAccessToken.getAccess_token());
		url.append("&openid=").append(openId).append("&lang=zh_CN");
		String resp_str = HttpUtil.get(url.toString(), null);
		log.debug("网页授权获取是否关注公众号微信公众号返回信息:" + resp_str);
		int subscribe = JSONObject.fromObject(resp_str).getInt("subscribe");
		return 0 != subscribe;
	}

	/**
	 * 获取常用服务器ip地址
	 */
	public void getIpList() {
		StringBuffer url = new StringBuffer();
		url.append("https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=");
		url.append(WxAccessToken.getAccess_token());
		String resp_str = HttpUtil.get(url.toString(), null);
		log.debug("微信公众号返回信�?:" + resp_str);
	}

	public void deleteMenu() {
		// https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN
		StringBuffer url = new StringBuffer();
		url.append("https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=");
		url.append(WxAccessToken.getAccess_token());
		String resp_str = HttpUtil.get(url.toString(), null);
		log.debug("微信公众号返回信�?:" + resp_str);
	}

	/**
	 * 新增微信菜单
	 */
	public void addMenu() {
		StringBuffer url = new StringBuffer();
		url.append("https://api.weixin.qq.com/cgi-bin/menu/create?access_token=");
		url.append(WxAccessToken.getAccess_token());
		String params = "{\"button\": [{\"type\":\"view\",\"name\":\"我的\",\"url\":\"http://dev.kakasys.com/wx/mine\"}]}";
		String resp_str = HttpUtil.post(url.toString(), params, null);
		log.debug("微信公众号返回信�?:" + resp_str);
	}

	/**
	 * 通过 json获取批量的用户信�?
	 * 
	 * @param json
	 * @return
	 */
	public JSONObject getAllUserInfo(JSONObject json) {
		JSONObject userlist = new JSONObject();
		StringBuffer url = new StringBuffer();
		url.append("https://api.weixin.qq.com/cgi-bin/menu/create?access_token=");
		url.append(WxAccessToken.getAccess_token());
		String params = json.toString();
		String resp_str = HttpUtil.post(url.toString(), params, null);
		log.debug("微信公众号返回信�?:" + resp_str);
		return userlist;
	}

	/**
	 * 
	 * @param mch_billno
	 *            订单尾号
	 * @return
	 */
	public String queryRedPack(String mch_billno) {
		String url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/gethbinfo";

		String mch_id = Param.getValue("WXPAY", "mch_id");
		String appid = Param.getValue("WX", "APPID");
		String bill_type = "MCHT";
		String cert = Param.getValue("WXPAY", "CERTPATH");
		cert = WxApi.class.getResource("/" + cert).getFile();
		String certpassword = Param.getValue("WXPAY", "CERTPASSWORD");
		String key = Param.getValue("WXPAY", "KEY");
		String nonce_str = UUID.randomUUID().toString().replaceAll("-", "");

		StringBuffer s = new StringBuffer();
		s.append("appid=").append(appid);
		s.append("&bill_type=").append(bill_type);
		s.append("&mch_billno=").append(mch_billno);
		s.append("&mch_id=").append(mch_id);
		s.append("&nonce_str=").append(nonce_str);
		s.append("&key=").append(key);

		String sign = DigestUtils.md5Hex(s.toString()).toUpperCase();

		StringBuffer xml = new StringBuffer();
		xml.append("<xml>");
		xml.append("<sign><![CDATA[" + sign + "]]></sign>");
		xml.append("<mch_billno><![CDATA[" + mch_billno + "]]></mch_billno>");
		xml.append("<mch_id><![CDATA[" + mch_id + "]]></mch_id>");
		xml.append("<appid><![CDATA[" + appid + "]]></appid>");
		xml.append("<bill_type><![CDATA[MCHT]]></bill_type> ");
		xml.append("<nonce_str><![CDATA[" + nonce_str + "]]></nonce_str>");
		xml.append("</xml>");

		String rst = HttpUtil.postSSL(url, xml.toString(), cert, certpassword);
		return rst;
	}

	/**
	 * 通过openid获取微信用户信息
	 * 
	 * @param openid
	 * @return
	 */
	public JSONObject getUserInfoByOpenId(String openid) {
		JSONObject user = new JSONObject();
		StringBuffer url = new StringBuffer();
		url.append("https://api.weixin.qq.com/cgi-bin/user/info?access_token=");
		url.append(WxAccessToken.getAccess_token());
		url.append("&openid=");
		url.append(openid).append("&lang=zh_CN");
		String resp_str = HttpUtil.get(url.toString(), null);
		log.debug("微信公众号返回信�?:" + resp_str);
		return user;
	}

	/**
	 * 新活动�?�知
	 */
	public void sendHDTZ(Set<String> toUsers, String activity_name, String activity_time, String activity_url) {
		StringBuffer url = new StringBuffer();
		url.append("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=");
		url.append(WxAccessToken.getAccess_token());
		JSONObject arry = new JSONObject();
		JSONObject first = new JSONObject();
		first.put("value", "新活动�?�知");
		first.put("color", "#173177");
		arry.put("first", first);

		JSONObject keyword1 = new JSONObject();
		keyword1.put("value", "活动分享推广");
		keyword1.put("color", "#173177");
		arry.put("keyword1", keyword1);

		JSONObject keyword2 = new JSONObject();
		keyword2.put("value", activity_name);
		keyword2.put("color", "#173177");
		arry.put("keyword2", keyword2);

		JSONObject keyword3 = new JSONObject();
		keyword3.put("value", activity_time);
		keyword3.put("color", "#173177");
		arry.put("keyword3", keyword3);

		JSONObject remark = new JSONObject();
		remark.put("value", "更多精彩请继续关�?");
		remark.put("color", "#173177");
		arry.put("remark", remark);

		JSONObject json = new JSONObject();
		json.put("template_id", "LnFs4TgM1f7Ih-F6MSRvDOfQTbMRISOw95eIn-IQ-PM");
		json.put("data", arry);
		for (String openid : toUsers) {
			json.put("url", activity_url + "?openid=" + openid);
			json.put("touser", openid);
			String resp_str = HttpUtil.post(url.toString(), json.toString(), null);
			log.debug("微信公众号返回信�?:" + resp_str);
		}
	}

	/**
	 * 意向客户抢单通知
	 */
	public void sendYXKH(Set<String> toUsers, String mobile_, String mobile, String yytime, String activity_name,
			String orderid) {
		StringBuffer url = new StringBuffer();
		url.append("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=");
		url.append(WxAccessToken.getAccess_token());
		JSONObject arry = new JSONObject();

		JSONObject first = new JSONObject();
		first.put("value", "亲,你有�?位意向客户待跟进�?");
		first.put("color", "#173177");
		arry.put("first", first);

		JSONObject keyword1 = new JSONObject();
		keyword1.put("value", "");
		keyword1.put("color", "#173177");
		arry.put("keyword1", keyword1);

		JSONObject keyword2 = new JSONObject();
		keyword2.put("value", mobile_);
		keyword2.put("color", "#173177");
		arry.put("keyword2", keyword2);

		JSONObject keyword3 = new JSONObject();
		keyword3.put("value", yytime);
		keyword3.put("color", "#173177");
		arry.put("keyword3", keyword3);

		JSONObject keyword4 = new JSONObject();
		keyword4.put("value", activity_name);
		keyword4.put("color", "#173177");
		arry.put("keyword4", keyword4);

		JSONObject remark = new JSONObject();
		remark.put("value", "请您确认是否接此任务");
		remark.put("color", "#173177");
		arry.put("remark", remark);

		JSONObject json = new JSONObject();
		json.put("template_id", "md1vYcqYlBMRfQF2qa13E6XTIHISwn_wdsH-h9sXmVs");
		json.put("data", arry);
		for (String openid : toUsers) {
			json.put("touser", openid);
			json.put("url", host + "wx/tz1/" + orderid + "/" + openid);
			String resp_str = HttpUtil.post(url.toString(), json.toString(), null);
			log.debug("微信公众号返回信�?:" + resp_str);
		}
	}

	/**
	 * 活动推广微信通知
	 * 
	 * @param toUsers
	 * @param activityName
	 * @param activityType
	 * @param customerName
	 * @param sendTime
	 * @param activytiUrl
	 */
	public boolean sendWxActivitySend(String openID, String activityName, String activityType, String customerName,
			String sendTime, String activytiUrl) {
		StringBuffer url = new StringBuffer();
		url.append("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=");
		url.append(WxAccessToken.getAccess_token());
		JSONObject arry = new JSONObject();

		JSONObject first = new JSONObject();
		first.put("value", "活动推广通知");
		first.put("color", "#173177");
		arry.put("first", first);

		JSONObject keyword1 = new JSONObject();
		keyword1.put("value", activityName);
		keyword1.put("color", "#173177");
		arry.put("keyword1", keyword1);

		JSONObject keyword2 = new JSONObject();
		keyword2.put("value", customerName);
		keyword2.put("color", "#173177");
		arry.put("keyword2", keyword2);

		JSONObject keyword3 = new JSONObject();
		keyword3.put("value", activityType);
		keyword3.put("color", "#173177");
		arry.put("keyword3", keyword3);

		JSONObject keyword4 = new JSONObject();
		keyword4.put("value", sendTime);
		keyword4.put("color", "#173177");
		arry.put("keyword4", keyword4);

		JSONObject remark = new JSONObject();
		remark.put("value", "分享越多,奖品越多哦�?");
		remark.put("color", "#173177");
		arry.put("remark", remark);

		JSONObject json = new JSONObject();
		json.put("template_id", "t_BZI6krXYPe4f8uSbo5wCG64umwv7_cacr_3ijeqYE");
		json.put("data", arry);
		String resp_str = "";
		json.put("touser", openID);
		json.put("url", activytiUrl);
		resp_str = HttpUtil.post(url.toString(), json.toString(), null);
		log.debug("微信公众号返回信�?:" + resp_str);
		boolean flag = false;
		try {
			flag = JSONObject.fromObject(resp_str).getString("errcode").equals("0");
		} catch (Exception e) {
			return flag;
		}
		return flag;
	}

	/** 微信服务器地�? */
	String host = Param.getValue("SYSTEM", "HOST");
}

 

 

 

转载于:https://my.oschina.net/zz006/blog/879374

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值