欢迎光临,了解微信小程序开发,就上易用通!

微信小程序之请求二维码(用户点击按钮生成带参二维码)

发布:2018-01-24 18:22浏览: 来源:网络 作者:tianshu

目标:
请求二维码并展示
步骤:
用户点击按钮生成二维码
步骤:
1、微信小程序往后台请求二维码
2、后台(java/php) 根据微信小程序信息往微信端请求tonken
3、后台得到tonken后往微信端请求二维码图片
4、后台得到图片后保存在服务器上,将路径返回给微信小程序
5、微信小程序得到路径后,根据路径下载图片
6、下载图片成功后再保存至本地
7、保存成功后将路径给予image标签里面展示

代码:
wxml
[AppleScript] 
  1. <image class="scanimg" src="{{filePath}}" bindtap="getAgain"></image>
  2. <button type="primary" bindtap="primary">点击生成二维码</button>





js代码
[AppleScript] 
  1. primary:function (e) {
  2. var _url = '后台地址';
  3.   wx.request({
  4.     url: _url,
  5. //请求报文体
  6.     data: [{
  7.       id: agentCode
  8.     }],
  9.     method: 'POST',
  10.     header: {
  11.       'content-type': 'application/json'
  12.     },
  13.     success: function (res) {
  14. //为00时表示成功,得到二维码的地址
  15.       if (res.data.code == '00') {
  16.         console.log("成功")
  17. //下载二维码
  18.         wx.downloadFile({
  19.           url: res.data.body[0].URL,
  20.           success: function (res) {
  21. //如果二维码中的id为固定值可以将图片保存到本地,否则不用保存
  22.             wx.saveFile({
  23.               tempFilePath: res.tempFilePath,
  24.               success: function (res) {
  25.                 console.log("保存成功")
  26. _that.setData({
  27. filePath: res.savedFilePath
  28. })
  29. console.log(res.savedFilePath)
  30. try {
  31. //id为定值,则将保存的地址存入缓存,非定值则只需要setData就行
  32. wx.setStorageSync('filePath', res.savedFilePath)
  33. } catch (e) {
  34. console.log(e)
  35. }
  36.               },
  37.               fail: function (res) {
  38.                 console.log("保存失败")
  39.                 console.log(res)
  40.               }
  41.             })
  42.           }, fail: function (res) {
  43.             util.msg("错误", "通讯失败")
  44.             console.log(res)
  45.           }
  46.         })
  47.       } else {
  48.         console.log("错误")
  49.         util.msg("错误", res.data.msg)
  50.       }
  51.     },
  52.     fail: function () {
  53.       util.msg("错误", "通讯失败")
  54.       console.log(res)
  55.     }
  56.   })
  57. }


java端代码
[Java]
  1. // 访问微信后台的URL
  2. String URL = systemConfig.getString("LoginOrRegisterUrl");
  3. // 请求类型
  4. String grant_type = systemConfig.getString("grant_type");
  5. // 第三方用户唯一凭证密钥
  6. String secret = systemConfig.getString("secret");
  7. // 第三方用户唯一凭证
  8. String appId = systemConfig.getString("appid");
  9. // 请求token时用到的URL
  10. String tokenUrl = systemConfig.getString("tokenUrl");
  11.  
  12. // 向微信后台请求获取token
  13.                         String sendGet = HttpClientConnectionManager.sendGet(
  14.                                 tokenUrl, "grant_type=" + grant_type
  15.                                         + "&secret=" + secret + "&appid="
  16.                                         + appId + "");
  17.                         System.out.println(sendGet);
  18.                         JSONObject json = JSONObject.fromObject(sendGet);
  19.                         access_token = json.get("access_token").toString();
  20.                         if (access_token == null) {
  21. //没有token 则返回错误码和错误信息
  22.                             agentDTO.setCode("0002");
  23.                             agentDTO.setDesc("获取tokenId失败");
  24.                             return agentDTO;
  25.                         }
  26. System.out.println(access_token);
  27. // 访问微信后台带的json参数
  28.                     Map<String, Object> map = new HashMap<String, Object>();
  29.                     map.put("path", "pages/register");//你二维码中跳向的地址
  30.                     map.put("width", "430");//图片大小
  31.                     JSONObject json = JSONObject.fromObject(map);
  32.                     HttpClientConnectionManager.httpPostWithJSON(URL
  33.                             + access_token, json.toString(), id + "max");
  34.                     // 返回给前端的后台服务器文件读取路径
  35.                     String downloadUrl = systemConfig
  36.                             .getString("agentImgDownloadUrl")
  37.                             + id
  38.                             + "max"
  39.                             + "/";
  40.                     // 返回给前端的后台服务器文件下载路径
  41.                     String downloadfileUrl = downloadUrl + id + "max" + ".jpg";
  42.                     agentResView.setURL(downloadfileUrl);
  43.                     agentDTO.setAgentResView(agentResView);
  44. agentDTO.setCode("00");
  45. agentDTO.setDesc("成功");
  46.                         return agentDTO;


HttpClientConnectionManager.java 文件
[Java] 
  1. package com.hsh.utils.http;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.File;
  5. import java.io.FileNotFoundException;
  6. import java.io.FileOutputStream;
  7. import java.io.IOException;
  8. import java.io.InputStream;
  9. import java.io.InputStreamReader;
  10. import java.io.ObjectOutputStream;
  11. import java.net.URL;
  12. import java.net.URLConnection;
  13. import java.net.URLEncoder;
  14. import java.util.List;
  15. import java.util.Locale;
  16. import java.util.Map;
  17. import java.util.ResourceBundle;
  18. import net.sf.json.JSONObject;
  19. import org.apache.http.HttpEntity;
  20. import org.apache.http.HttpResponse;
  21. import org.apache.http.client.HttpClient;
  22. import org.apache.http.client.methods.HttpPost;
  23. import org.apache.http.conn.ClientConnectionManager;
  24. import org.apache.http.conn.scheme.Scheme;
  25. import org.apache.http.conn.scheme.SchemeRegistry;
  26. import org.apache.http.entity.StringEntity;
  27. import org.apache.http.impl.client.DefaultHttpClient;
  28. import org.apache.http.message.BasicHeader;
  29. import org.apache.http.protocol.HTTP;
  30.  
  31. @SuppressWarnings("deprecation")
  32. public class HttpClientConnectionManager {
  33.          
  34.         /**
  35.          * 获取SSL验证的HttpClient
  36.          * @param httpClient
  37.          * @return
  38.          */
  39.         @SuppressWarnings("deprecation")
  40.         public static HttpClient getSSLInstance(HttpClient httpClient){
  41.                 ClientConnectionManager ccm = httpClient.getConnectionManager();
  42.                 SchemeRegistry sr = ccm.getSchemeRegistry();
  43.                 sr.register(new Scheme("https", MySSLSocketFactory.getInstance(), 443));
  44.                 httpClient =  new DefaultHttpClient(ccm, httpClient.getParams());
  45.                 return httpClient;
  46.         }
  47.          
  48.         /**
  49.          * 模拟浏览器post提交
  50.          * 
  51.          * @param url
  52.          * @return
  53.          */
  54.         public static HttpPost getPostMethod(String url) {
  55.                 HttpPost pmethod = new HttpPost(url); // 设置响应头信息
  56.                 pmethod.addHeader("Connection", "keep-alive");
  57.                 pmethod.addHeader("Accept", "*/*");
  58.                 pmethod.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
  59.                 pmethod.addHeader("Host", "api.mch.weixin.qq.com");
  60.                 pmethod.addHeader("X-Requested-With", "XMLHttpRequest");
  61.                 pmethod.addHeader("Cache-Control", "max-age=0");
  62.                 pmethod.addHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) ");
  63.                 return pmethod;
  64.         }
  65.          
  66.         /**
  67.      * 构建get方式的url
  68.      * 
  69.      * @param reqUrl
  70.      *            基础的url地址
  71.      * @param params
  72.      *            查询参数
  73.      * @return 构建好的url
  74.      */
  75.                  
  76.          
  77.         public static String httpPostWithJSON(String url, String json,String id)
  78.             throws Exception {
  79.         String result = null;
  80.         // 将JSON进行UTF-8编码,以便传输中文
  81.         String encoderJson = URLEncoder.encode(json, HTTP.UTF_8);
  82.   
  83.         DefaultHttpClient httpClient = new DefaultHttpClient();
  84.         HttpPost httpPost = new HttpPost(url);
  85.         httpPost.addHeader(HTTP.CONTENT_TYPE, "application/json");
  86.   
  87.         StringEntity se = new StringEntity(json);
  88.         se.setContentType("application/json");
  89.         se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,
  90.                         "UTF-8"));
  91.         httpPost.setEntity(se);
  92.         // httpClient.execute(httpPost);
  93.         HttpResponse response = httpClient.execute(httpPost);
  94.         if (response != null) {
  95.             HttpEntity resEntity = response.getEntity();
  96.             if (resEntity != null) {
  97.                 InputStream instreams = resEntity.getContent(); 
  98.                 ResourceBundle systemConfig = ResourceBundle.getBundle(
  99.                             "config/system", Locale.getDefault());
  100.                     String uploadSysUrl = systemConfig.getString("agentImgUrl")+id+"/";
  101.                     File saveFile = new File(uploadSysUrl+id+".jpg");
  102.                        // 判断这个文件(saveFile)是否存在
  103.                        if (!saveFile.getParentFile().exists()) {
  104.                            // 如果不存在就创建这个文件夹
  105.                            saveFile.getParentFile().mkdirs();
  106.                        }
  107.                 saveToImgByInputStream(instreams, uploadSysUrl, id+".jpg");
  108.             }
  109.         }
  110.         return result;
  111.     } 
  112.          
  113.         /* @param instreams 二进制流
  114.     * @param imgPath 图片的保存路径
  115.     * @param imgName 图片的名称
  116.     * @return
  117.     *      1:保存正常
  118.     *      0:保存失败
  119.     */
  120.    public static int saveToImgByInputStream(InputStream instreams,String imgPath,String imgName){
  121.   
  122.        int stateInt = 1;
  123.        if(instreams != null){
  124.            try {
  125.                File file=new File(imgPath,imgName);//可以是任何图片格式.jpg,.png等
  126.                FileOutputStream fos=new FileOutputStream(file);
  127.                     
  128.                byte[] b = new byte[1024];
  129.                int nRead = 0;
  130.                while ((nRead = instreams.read(b)) != -1) {
  131.                    fos.write(b, 0, nRead);
  132.                }
  133.                fos.flush();
  134.                fos.close();                
  135.            } catch (Exception e) {
  136.                stateInt = 0;
  137.                e.printStackTrace();
  138.            } finally {
  139.            }
  140.        }
  141.        return stateInt;
  142.    }
  143.     
  144.    public void write(Object o, String path) {  
  145.            try {  
  146.             /* 创建存取文件 */  
  147.             FileOutputStream fileStream = new FileOutputStream(path);  
  148.             /* 将存取文件写入对象 */  
  149.             ObjectOutputStream os = new ObjectOutputStream(fileStream);
  150.             /* 写入对象 */  
  151.             os.writeObject(o);  
  152.             System.out.println("写入数据成功");  
  153.             /* 关闭ObjectOutputStream */  
  154.             os.close();  
  155.            } catch (FileNotFoundException e) {  
  156.             e.printStackTrace();  
  157.            } catch (IOException e) {  
  158.             e.printStackTrace();  
  159.            }  
  160.         } 
  161.     
  162.    public static boolean exists(String imgPath){
  163.            File saveFile = new File(imgPath);
  164.        if (!saveFile.getParentFile().exists()) {
  165.                return false;
  166.        }else{
  167.                //如果存在判断这个文件的大小
  168.                if(saveFile.length()>0){
  169.                        System.out.println("--------------------------------"+saveFile.length());
  170.                        return true;
  171.                }else{
  172.                        return false;
  173.                }
  174.        }
  175.          
  176.    }
  177.     
  178.     
  179.    /**
  180.     * 向指定URL发送GET方法的请求
  181.     * 
  182.     * @param url
  183.     *            发送请求的URL
  184.     * @param param
  185.     *            请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
  186.     * @return URL 所代表远程资源的响应结果
  187.     */
  188.    public static String sendGet(String url, String param) {
  189.        String result = "";
  190.        BufferedReader in = null;
  191.        try {
  192.            String urlNameString = url + "?" + param;
  193.            System.out.println(urlNameString+"........");
  194.            URL realUrl = new URL(urlNameString);
  195.            // 打开和URL之间的连接
  196.            URLConnection connection = realUrl.openConnection();
  197.            // 设置通用的请求属性
  198.            connection.setRequestProperty("accept", "*/*");
  199.            connection.setRequestProperty("connection", "Keep-Alive");
  200.            connection.setRequestProperty("user-agent",
  201.                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
  202.            // 建立实际的连接
  203.            connection.connect();
  204.            // 获取所有响应头字段
  205.            Map<String, List<String>> map = connection.getHeaderFields();
  206.            // 遍历所有的响应头字段
  207.            for (String key : map.keySet()) {
  208.                System.out.println(key + "--->" + map.get(key));
  209.            }
  210.            // 定义 BufferedReader输入流来读取URL的响应
  211.            in = new BufferedReader(new InputStreamReader(
  212.                    connection.getInputStream()));
  213.            String line;
  214.            while ((line = in.readLine()) != null) {
  215.                result += line;
  216.            }
  217.        } catch (Exception e) {
  218.            System.out.println("发送GET请求出现异常!" + e);
  219.            e.printStackTrace();
  220.        }
  221.        // 使用finally块来关闭输入流
  222.        finally {
  223.            try {
  224.                if (in != null) {
  225.                    in.close();
  226.                }
  227.            } catch (Exception e2) {
  228.                e2.printStackTrace();
  229.            }
  230.        }
  231.        return result;
  232.    }
  233.  
  234.     
  235.     
  236.    public static void main(String[] args) {
  237.            /*Map<String, Object> map = new HashMap<String,Object>();
  238.             map.put("path", "pages/register");
  239.             map.put("width", "430");*/
  240.           String sendGet = sendGet("https://api.weixin.qq.com/cgi-bin/token", "grant_type=client_credential&secret=&appid=");
  241.           System.out.println(sendGet);
  242.           JSONObject json = JSONObject.fromObject(sendGet);
  243.           String token = json.get("access_token").toString();
  244.           System.out.println(token);
  245.           /* String reqUrl = "https://api.weixin.qq.com/cgi-bin/token";
  246.                     *///sendGet(reqUrl, params)
  247. }
  248. }


tip
1、这是申请一张二维码的代码,申请多张可以用for或者其他的方法
2、当id为定量时,每次点击按钮判断filePath缓存是否存在,存在则直接取值展示,不存在则向后台请求二维码
3、重点提示步骤第三步获取的tonken是有有效期的,时长为2小时,2小时候需要重新请求一次tonken 



免责声明:本站所有文章和图片均来自用户分享和网络收集,文章和图片版权归原作者及原出处所有,仅供学习与参考,请勿用于商业用途,如果损害了您的权利,请联系网站客服处理。