微信开发——使用微信接口(获取地理位置)

摘要:
生成微信签名(只要访问微信的接口,都需要生成签名验证来进行config)a.获取AccessToken//定义静态常量存放获取AccessToken的URLpublicfinalstaticStringGetPageAccessTokenUrl="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=A
  1. 生成微信签名(只要访问微信的接口,都需要生成签名验证来进行config)

    a. 获取AccessToken

    //定义静态常量存放获取AccessToken的URL
    public final static String GetPageAccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=SECRET";
    
    /**
     * 获取AccessToken
     **/
    public Map<String, String> getAccessToken(String appid, String appsecret) {
        //使用传入的appid和appsecret,获取指定的URL
        String requestUrl = GetPageAccessTokenUrl.replace("APPID", appid).replace("SECRET", appsecret);
        //发送请求,获取AccessToken
        HttpClient client = null;
        Map<String, String> result = new HashMap<String, String>();
        String accessToken = null;
        try {
            client = new DefaultHttpClient();
            HttpGet httpget = new HttpGet(requestUrl);
            ResponseHandler<String> responseHandler = new BasicResponseHandler();
            String response = client.execute(httpget, responseHandler);
            JSONObject OpenidJSONO = JSONObject.parseObject(response);
            accessToken = String.valueOf(OpenidJSONO.get("access_token"));
            result.put("accessToken", accessToken);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            client.getConnectionManager().shutdown();
        }
        return result;
    }
    

    b. 获取JsApiTicket

    //定义静态常量存放获取JsApiTicket的URL
    public final static String GetPageJsApiTicketUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";
    
    /*
     * 获取JsApiTicket
     **/
    public Map<String, String> getJsapiTicket(String accessToken) {
         String requestUrl = GetPageJsApiTicketUrl.replace("ACCESS_TOKEN", accessToken);
         HttpClient client = null;
         Map<String, String> result = new HashMap<String, String>();
         try {
             client = new DefaultHttpClient();
             HttpGet httpget = new HttpGet(requestUrl);
             ResponseHandler<String> responseHandler = new BasicResponseHandler();
             String response = client.execute(httpget, responseHandler);
             JSONObject OpenidJSONO = JSONObject.parseObject(response);
             String errcode = String.valueOf(OpenidJSONO.get("errcode"));
             String errmsg = String.valueOf(OpenidJSONO.get("errmsg"));
             String ticket = String.valueOf(OpenidJSONO.get("ticket"));
             String expires_in = String.valueOf(OpenidJSONO.get("expires_in"));
             result.put("errcode", errcode);
             result.put("errmsg", errmsg);
             result.put("ticket", ticket);
             result.put("expires_in", expires_in);
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
             client.getConnectionManager().shutdown();
         }
         return result;
     }
    

    c. 获取随机字符串

    public String getRandomStr(int length) {
        String base = "abcdefghijklmnopqrstuvwxyz0123456789";
        int randomNum;
    	char randomChar;
        Random random = new Random();
        // StringBuffer类型的可以append增加字符
        StringBuffer str = new StringBuffer();
     
        for (int i = 0; i < length; i++) {
            // 可生成[0,n)之间的整数,获得随机位置
            randomNum = random.nextInt(base.length());
            // 获得随机位置对应的字符
            randomChar = base.charAt(randomNum);
            // 组成一个随机字符串
            str.append(randomChar);
        }
        return str.toString();
    }
    

    d. 获取时间戳

    String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
    

    e. 按顺序拼接字符串

    String str = "jsapi_ticket=" + jsapiTicket + "&noncestr=" + noncestr + "&timestamp=" + timestamp + "&url=" + url;//将参数排序并拼接字符串
    

    f. 使用SH1加密字符串

    /**
     * SH1加密
     */
    private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};  
    
    /** 
    * Takes the raw bytes from the digest and formats them correct. 
    * 
    * @param bytes the raw bytes from the digest. 
    * @return the formatted bytes. 
    */  
    private static String getFormattedText(byte[] bytes) {  
    	int len = bytes.length;  
    	StringBuilder buf = new StringBuilder(len * 2);  
    	// 把密文转换成十六进制的字符串形式  
    	for (int j = 0; j < len; j++) {  
    		buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);  
    		buf.append(HEX_DIGITS[bytes[j] & 0x0f]);  
    	}  
    	return buf.toString();  
    }  
    
    public String encode(String str) {  
    	if (str == null) {  
    		return null;  
    	}  
    	try {  
    		MessageDigest messageDigest = MessageDigest.getInstance("SHA1");  
    		messageDigest.update(str.getBytes());  
    		return getFormattedText(messageDigest.digest());  
    	} catch (Exception e) {  
    		throw new RuntimeException(e);  
    	}  
    }
    

    j. 返回数据

    JSONObject jsonObject = new JSONObject();
    jsonObject.put("appId", "APPID");
    jsonObject.put("timestamp",timestamp);
    jsonObject.put("accessToken",accessToken);
    jsonObject.put("ticket",jsapiTicket);
    jsonObject.put("nonceStr",noncestr);
    jsonObject.put("signature",signature);
    return ResultUtil.successResult(jsonObject);
    
  2. 使用生成的签名访问微信API之前需要先进行wx.config校验
    (企业微信签名正确但是验证不通过,说明没有进行安全域名验证,需要进入企业微信找到对应的应用进行安全域名验证)

    wx.config({
    	debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来
    	appId: data.content.appId,// 必填,公众号的唯一标识
    	timestamp: data.content.timestamp,// 必填,生成签名的时间戳
    	nonceStr: data.content.nonceStr, // 必填,生成签名的随机串
    	signature: data.content.signature,// 必填,签名,见附录1
    	jsApiList: ['getLocation'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
    });
    
    wx.error(function (res) {
    	console.log(res);
    });
    
    wx.ready(function() {
    	// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
    	console.log("wx.ready");
    	wxlocate();
    });
    
  3. 访问微信接口(获取地理位置接口)

    wx.getLocation({
    	debug: false,
    	type: 'wgs84', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
    	success(res) {
    		console.log("wx.getLocation");
    		var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
    		var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
    		var gpsPoint = new BMap.Point(longitude, latitude);
    		BMap.Convertor.translate(gpsPoint, 0, initMap); //转换坐标
    
    	},
    	fail(err){
    		console.log(err);
    	}
    });
    

免责声明:文章转载自《微信开发——使用微信接口(获取地理位置)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C# String 前面不足位数补零的方法Win10+YOLOv3完整安装过程(亲测可运行)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C++ string字符串修改和替换方法详解

字符串内容的变化包括修改和替换两种。本节将分别讲解字符串内容的修改和字符串内容的替换。字符串内容的修改 可以通过使用多个函数修改字符串的值。例如 assign(),operator=,erase(),交换(swap),插入(insert)等。另外,还可通过 append() 函数添加字符。 下面逐一介绍各成员函数的使用方法。assign()函数 使用 as...

【Swift】WKWebView与JS的交互使用

一、前言   近日,有朋友问我关于WKWebView与JS的交互问题,可我之前一直使用的是UIWebView,也不曾做过WKWebView的交互啊!接下来大家一块学习下WKWebView是怎么实现原生代码和JS交互的。2016年时候曾写过一篇关于UIWebView与JS的交互。传送门>>> 二、WKWebView 支持更多的HTML5的...

设计模式之外观模式(门面模式)以及如何利用到接口设计中

什么是外观模式   外观模式(Facade),他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。这种类型的设计模式属于结构性模式。为子系统中的一组接口提供了一个统一的访问接口,这个接口使得子系统更容易被访问或者使用。  外观模式应用场景 简单来说,该模式就是把一些复杂的流程封装成一个接口供给外部用户更简单的使用。这个模式中,设计到3个角色。...

C++11 之 override

override 关键字 作用:在成员函数声明或定义中, override 确保该函数为虚函数并覆写来自基类的虚函数。位置:函数调用运算符之后,函数体或纯虚函数标识 “= 0” 之前。 使用以后有以下好处:1.可以当注释用,方便阅读.2.告诉阅读你代码的人,这是方法的复写.3.编译器可以给你验证 override 对应的方法名是否是你父类中所有的,如果没有...

第十章 内部类1

说明:内部类和组合是完全不同的概念,内部类看起来更像是一种代码隐藏机制。内部类了解外围类,并能与之通信。要创建一个内部类是非常简单的,只要将一个类定义在另一个类的内部即可。 创建内部类对象的方式: 1.如果内部类为公有、静态内部类: packagethink.in.java.test; /*** 一个包裹着公有的、静态的、内部类的外部类 * @aut...

C# 通过ServiceStack 操作Redis——Hash类型的使用及示例

接着上一篇,下面转到hash类型的代码使用 Hash:结构 key-key-value,通过索引快速定位到指定元素的,可直接修改某个字段 /// <summary> /// Hash:类似dictionary,通过索引快速定位到指定元素的,耗时均等,跟string的区别在于不用反序列化,直接修改某个字段 /// str...