微信公众平台 使用JS-SDK实现拍照上传功能

js-sdk文档地址:

流程:

  1. 引入JS文件
  2. 获取access_token
  3. 拿着access_token 获取 jsapi_ticket
  4. 拿着jsapi_ticket、一个随机串noncestr、一个时间戳timestamp、当前的url 去生成签名signature
  5. 拿着signature 进行config接口注入权限验证配置。

获取access_token

GET请求

获取jsapi_ticket

GET请求

参数:使用上一步获得的access_token

生成signature

签名算法

签名生成规则如下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里需要注意的是所有参数名均为小写字符。对string1作sha1加密,字段名和字段值都采用原始值,不进行URL 转义。

即signature=sha1(string1)。

示例:

Java版 生成sha1算法代码:

/**
     * sha1加密
     *
     * @param data
     * @return
     * @throws NoSuchAlgorithmException
     */
    public String sha1(String data) throws NoSuchAlgorithmException {
        //信息摘要器      算法名称
        MessageDigest md = MessageDigest.getInstance("SHA1");
        //把字符串转为字节数组
        byte[] b = data.getBytes();
        //使用指定的字节来更新我们的摘要
        md.update(b);
        //获取密文  (完成摘要计算)
        byte[] b2 = md.digest();
        //获取计算的长度
        int len = b2.length;
        //16进制字符串
        String str = "0123456789abcdef";
        //把字符串转为字符串数组
        char[] ch = str.toCharArray();

        //创建一个40位长度的字节数组
        char[] chs = new char[len * 2];
        //循环20次
        for (int i = 0, k = 0; i < len; i++) {
            byte b3 = b2[i];//获取摘要计算后的字节数组中的每个字节
            // >>>:无符号右移
            // &:按位与
            //0xf:0-15的数字
            chs[k++] = ch[b3 >>> 4 & 0xf];
            chs[k++] = ch[b3 & 0xf];
        }

        //字符数组转为字符串
        return new String(chs);
    }

config接口注入权限验证配置

ready接口处理成功验证

wx.ready(function(){
  // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
    alert("wx ready.");
});

弹出wx ready. 说明配置成功。

调用拍照接口

调用接口需要在config配置时添加自己需要的接口,如拍照接口 chooseImage

拍照、上传、下载、获取本地图片接口

这里的上传仅仅只返回图片服务器端ID,继续调用下载,获取本地图片接口才可得到图片的base64数据,完整代码:

经验分享 程序员 微信小程序 职场和发展