• Vue 实现微信 jssdk 扫码, 上传图片


    流程

    1: 配置微信公众号JS域名

    2:前端发送URL后台获取JSSDK配置,

    后台Service代码如下, 修改2处位置:

      WeixinUtil.APPID => 当前公众号APPID

      WeixinUtil.getAccessToken() => 当前公众号access_token

    public interface IWxJssdkService {
        Map<String, Object> getJssdkConfig(String url);
    }
    @Service
    public class WxJssdkService implements IWxJssdkService {
    
        private Logger logger = LoggerFactory.getLogger(this.getClass());
    
        @Override
        public Map<String,Object> getJssdkConfig(String url) {
            Map<String,Object> result = new Map<String,Object>();
            try {
                //生成签名的随机串
                String nonceStr = create_nonce_str();
                //生成签名的时间戳
                String timestamp = create_timestamp();
                //签名
                String signature = createSignature(url, nonceStr, timestamp);
                result.setErrCode("0");
                result.put("appId", WeixinUtil.APPID);
                result.put("timestamp", timestamp);
                result.put("nonceStr", nonceStr);
                result.put("signature", signature);
            } catch (Exception e) {
                e.printStackTrace();
                logger.info("wrong:" + e.getMessage());
                result.setErrCode("-1");
            }
            return result;
        }
    
        private String getJsapiTicket() {
            String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + WeixinUtil.getAccessToken() + "&type=jsapi";
            try {
                String rs = RequestUtil.doGet(url, null);
                JSONObject obj_content = new JSONObject(rs);
                String jsapi_ticket = obj_content.getString("ticket");
                return jsapi_ticket;
            } catch (Exception e) {
                e.printStackTrace();
                logger.info("获取微信jsapiTicket错误.");
            }
            return null;
        }
    
        private String create_timestamp() {
            return Long.toString(System.currentTimeMillis() / 1000);
        }
    
        private String create_nonce_str() {
            return UUID.randomUUID().toString();
        }
    
        private static String byteToHex(final byte[] hash) {
            Formatter formatter = new Formatter();
            for (byte b : hash) {
                formatter.format("%02x", b);
            }
            String result = formatter.toString();
            formatter.close();
            return result;
        }
    
        /**
         * 根据jsapi_ticket等参数进行SHA1加密
         *
         * @param url 当前页面url
         */
        public String createSignature(String url, String nonceStr, String timestamp) {
            String jsapiTicket = getJsapiTicket();
            String signature = "jsapi_ticket=" + jsapiTicket;
            signature += "&noncestr=" + nonceStr;
            signature += "&timestamp=" + timestamp;
            signature += "&url=" + url;
    
            logger.info("jsapi_ticket:{}", jsapiTicket);
            logger.info("noncestr:{}", nonceStr);
            logger.info("timestamp:{}", timestamp);
            logger.info("url:{}", url);
            logger.info("signture before:{}", signature);
    
            try {
                MessageDigest crypt = MessageDigest.getInstance("SHA-1");
                crypt.reset();
                crypt.update(signature.getBytes("UTF-8"));
                signature = byteToHex(crypt.digest());
    
                logger.info("signture after:" + signature);
            } catch (Exception e) {
                logger.error("Signature for SHA-1 is error:{}", e);
            }
    
    
            return signature;
        }
    }    
    View Code

    3: 请先安装weixin-js-sdk,  命令:npm install weixin-js-sdk --save-dev

     vue启动后axios请求后台并配置.

    import wx from 'weixin-js-sdk';
    wx.config({
         debug: true,            // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
         appId: result.appId,    // 必填,公众号的唯一标识
         timestamp: result.timestamp,  // 必填,生成签名的时间戳
         nonceStr: result.nonceStr, // 必填,生成签名的随机串
         signature: result.signature,// 必填,签名
         jsApiList: ['scanQRCode', 'chooseImage', 'uploadImage'] // 必填,需要使用的JS接口列表
    });

    4;相机 和 选择照片

     5:浏览器打开如下url: 这个serverId(media_id)可以获取图片了.

     https://api.weixin.qq.com/cgi-bin/media/get?access_token=微信access_token&media_id=serverId(media_id);

       

  • 相关阅读:
    模糊化控制
    第8章 控制对象的访问(setter、getter、proxy)
    第7章 面向对象与原型
    Termux键盘配置
    在md里画流程图
    设置浏览器不缓存文件
    安卓手机使用Termux及搭建FTP服务器
    第6章 未来的函数:生成器和promise
    第5章 精通函数:闭包和作用域
    第4章 函数进阶:理解函数调用
  • 原文地址:https://www.cnblogs.com/eason-d/p/9072394.html
Copyright © 2020-2023  润新知