微信公众号之网页授权demo

WXConfig.java

package com.zns.config;

public class WXConfig {
    public final static String appId = "";
    public final static String appSecret = "";
}

WXUtils.java

package com.zns.utils;

import java.util.HashMap;
import java.util.Map;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.zns.config.WXConfig;

public class WXUtils {
/**
* 获取生成的授权URL
*/
public static String getAuthorizeUrl(String redirectUrl) {
return String.format(
"https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=%s#wechat_redirect",
WXConfig.appId, redirectUrl, "snsapi_userinfo", "state_xxx");
}

/**
* 根据code获取access_token、openid等信息
*/
public static Map<String, String> getAccessToken(String code) {
JsonObject jsonObject = null;
Map<String, String> map = new HashMap();
try {
String url = String.format(
"https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code",
WXConfig.appId, WXConfig.appSecret, code);
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
HttpResponse httpResponse = httpClient.execute(httpGet);
HttpEntity httpEntity = httpResponse.getEntity();
String results = EntityUtils.toString(httpEntity, "utf-8");
Gson gson = new Gson();
jsonObject = gson.fromJson(results, JsonObject.class);
map.put("openid", jsonObject.get("openid").toString().replaceAll("\"", ""));
map.put("expires_in", jsonObject.get("expires_in").toString().replaceAll("\"", ""));
map.put("refresh_token", jsonObject.get("refresh_token").toString().replaceAll("\"", ""));
map.put("access_token", jsonObject.get("access_token").toString().replaceAll("\"", ""));
map.put("scope", jsonObject.get("scope").toString().replaceAll("\"", ""));
} catch (Exception ex) {
ex.printStackTrace();
}
return map;
}

/**
* 根据accessToken、openId获取用户信息
*/
public static Map<String, String> getUserInfo(String accessToken, String openId) {
Map<String, String> map = new HashMap();
String url = String.format("https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s&lang=zh_CN",
accessToken, openId);
JsonObject jsonObject = null;
try {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
HttpResponse httpResponse = httpClient.execute(httpGet);
HttpEntity httpEntity = httpResponse.getEntity();
String response = EntityUtils.toString(httpEntity, "utf-8");
Gson gson = new Gson();
jsonObject = gson.fromJson(response, JsonObject.class);
map.put("openid", jsonObject.get("openid").toString().replaceAll("\"", ""));
map.put("nickname", jsonObject.get("nickname").toString().replaceAll("\"", ""));
map.put("sex", jsonObject.get("sex").toString().replaceAll("\"", ""));
map.put("country", jsonObject.get("country").toString().replaceAll("\"", ""));
map.put("province", jsonObject.get("province").toString().replaceAll("\"", ""));
map.put("city", jsonObject.get("city").toString().replaceAll("\"", ""));
map.put("headimgurl", jsonObject.get("headimgurl").toString().replaceAll("\"", ""));
} catch (Exception ex) {
ex.printStackTrace();
}
return map;
}
}

WechatController.java

package com.zns.controller;

import java.security.MessageDigest;
import java.util.Arrays;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.zns.utils.WXUtils;

@Controller
public class WechatController {

    protected static Logger logger = Logger.getLogger(WechatController.class);

    // 自定义 token
    private String token = "123456";

    @RequestMapping("/handle")
    @ResponseBody
    public String index(HttpServletRequest request, HttpServletResponse response) throws Exception {
        // 微信加密签名
        String signature = request.getParameter("signature");
        // 随机字符串
        String echostr = request.getParameter("echostr");
        // 时间戳
        String timestamp = request.getParameter("timestamp");
        // 随机数
        String nonce = request.getParameter("nonce");

        String tmpStr = getSHA1(token, timestamp, nonce);
        if (tmpStr.equals(signature)) {
            return echostr;
        } else {
            return null;
        }
    }

    /**
     * 用SHA1算法生成安全签名
     *
     * @param token
     *            token
     * @param timestamp
     *            时间戳
     * @param nonce
     *            随机字符串
     * @return 安全签名
     */
    public String getSHA1(String token, String timestamp, String nonce) throws Exception {
        String[] array = new String[] { token, timestamp, nonce };
        StringBuffer sb = new StringBuffer();
        // 字符串排序
        Arrays.sort(array);
        for (int i = 0; i < array.length; i++) {
            sb.append(array[i]);
        }
        String str = sb.toString();
        // SHA1签名生成
        MessageDigest md = MessageDigest.getInstance("SHA-1");
        md.update(str.getBytes());
        byte[] digest = md.digest();

        StringBuffer hexstr = new StringBuffer();
        String shaHex = "";
        for (int i = 0; i < digest.length; i++) {
            shaHex = Integer.toHexString(digest[i] & 0xFF);
            if (shaHex.length() < 2) {
                hexstr.append(0);
            }
            hexstr.append(shaHex);
        }
        return hexstr.toString();
    }

    // 网页授权入口
    @RequestMapping("/preAuth")
    public void preAuth(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String redirectUrl="http://wechat.zengnansheng.com/auth";
        logger.info(WXUtils.getAuthorizeUrl(redirectUrl));
        response.sendRedirect(WXUtils.getAuthorizeUrl(redirectUrl));
    }

    // 网页授权
    @RequestMapping("/auth")
    public String auth(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String code=request.getParameter("code");
        logger.info("code:"+code);
        Map<String, String> accessTokenMap = WXUtils.getAccessToken(code);
        String openId = accessTokenMap.get("openid");
        String accessToken = accessTokenMap.get("access_token");
        if (!StringUtils.isEmpty(openId)) {
            Map<String, String> userInfoMap = WXUtils.getUserInfo(accessToken, openId);
            logger.info("用户信息:"+userInfoMap);
            //业务处理...
            return "重定向到新的url";
        }
        return "重定向到失败的url";
    }

}

原文地址:https://www.cnblogs.com/zengnansheng/p/10389805.html

时间: 2024-10-13 06:24:10

微信公众号之网页授权demo的相关文章

微信第三方平台处理授权公众号的网页授权接口

写一OAuthController的MVC控制器,用来接收公众号的网页授权请求 1 public async Task<ActionResult> RedirectCallback(string state, string code = "", string appid = "", string clienturl = "") 2 { 3 if (code.Length == 0) 4 { 5 if (clienturl.IndexO

PHP微信公众号JSAPI网页支付(下)

上一篇<a id="cb_post_title_url" class="postTitle2" href="http://www.cnblogs.com/hld123/p/6626323.html">PHP微信公众号JSAPI网页支付(上)</a>中讲到了公众号平台的相关设置以及支付的大致流程. 这一篇重点讲支付后,异步接受回调通知,以及处理后同步通知微信服务器. 首先梳理下整个jsapi支付的流程 1.网页授权获取用户o

微信公众号实现手机授权网页登录功能

前提条件 手机微信已经绑定过该公众号,已经存在该用户openId的映射关系 场景: 公众号绑定了一个接单系统,想要在pc网页中显示操作,订单的获取是需要权限的(绑定过该公众号才能使用和显示) 实现: 1.需要两个页面,一个在手机中显示授权的页面,一个是网页中显示二维码页面(扫描二维码后,手机端显示授权的页面) 2.二维码页面,调用后端接口,传入手机授权页面的url为参数,返回二维码图片(后端根据微信配置生成,包含传入的url信息和二维码的唯一标识,code)和这个二维码的唯一标识,后端提供第二个

微信公众号JSAPI网页支付

一.使用场景以及说明 使用场景:商户已有H5商城网站,用户通过消息或扫描二维码在微信内打开网页时,可以调用微信支付完成下单购买的流程. 说明:用户打开图文消息戒者扫描二维码,在微信内置浏览器打开网页进行的支付.商户网页前端通过使用微信提供的 JS API,调用微信支付模块.这种方式,适合需要在商户网页进行选购下单的购买流程. 二.准备工作 公共号支付需要提前在微信公共平台进行业务配置,包括设置支付授权目录.设置JS接口安全域名以及设置授权回调页面域名. 1.进行微信公众支付之前,我们需要申请个公

微信公众号(静默授权和分享)

微信网页授权 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='+ appId +'&redirect_uri=' + redirectUri + '&response_type=code&scope=snsapi_base#wechat_redirect' 以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的.用户感知的就是直接进入了回

微信支持的Authorization code授权模式(公众号开发)(开放平台资料中心中的代公众号发起网页授权)

链接:https://blog.csdn.net/ASZJBGD/article/details/82838356 主要流程分为两步: 1.获取code 2.通过code换取accesstoken 流程图: 第一步:请求CODE 请求方法 在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(一般而言,已微信认证的服务号拥有snsapi_base和snsapi_userinfo),使用微信客户端打开以下链接(严格按照以下格式,包括顺序和大小写,并请将参数替换为实际内容): https

微信公众号开发--网页用户授权

相信官方文档,以前的接口错误已经改正,用最新的即可,这几篇随笔是一个项目中拿出来的,缺什么方法去其他随笔里找找就有 1 import java.io.IOException; 2 import java.io.UnsupportedEncodingException; 3 import javax.servlet.ServletException; 4 import java.net.URLEncoder; 5 import java.util.ArrayList; 6 import java.

ASP.NET MVC5+EF6+EasyUI 后台管理系统(76)-微信公众平台开发-网页授权

前言 网页授权是:应用或者网站请求你用你的微信帐号登录,同意之后第三方应用可以获取你的个人信息 网上说了一大堆参数,实际很难理解和猜透,我们以实际的代码来演示比较通俗易懂 配置 实现之前我们必须配置用户授权获取用户信息的域名或者IP.正式公众号只能配置(域名) 第一步:登录公众号平台 跟我们之前配置公众号平台信息一样 第二步: 打开开发者工具 拉到下半部分位置的网页账号 第三步:配置你的授权回调域名 实现 我们模拟一个需要授权的页面(代码提供来自Senparc) 第一步:新建一个Controll

微信公众平台,网页授权及 40029 问题解决

1.跳转授权链接 https://open.weixin.qq.com/connect/oauth2/authorize?appid=xxx&redirect_uri=xxx&response_type=code&scope=snsapi_userinfo&state=STATE&connect_redirect=1#wechat_redirect &connect_redirect=1 这个参数,刚开始没有加,总是报 {'errcode':40029,'e