微信公众平台 使用JS-SDK实现拍照上传功能
js-sdk文档地址:
流程:
- 引入JS文件
- 获取access_token
- 拿着access_token 获取 jsapi_ticket
- 拿着jsapi_ticket、一个随机串noncestr、一个时间戳timestamp、当前的url 去生成签名signature
- 拿着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数据,完整代码: