微信公众平台开发 JS-SDK开发(图像接口实例)

本文并非是对微信JS-SDK说明文档的复制,而是通过一个简单的例子来更深入的了解使用微信JS-SDK,具体文档请参考官方说明文档《微信JS-SDK说明文档》。微信公众平台面向开发者开放微信内网页开发工具包(微信JS-SDK),通过微信JS-SDK提供的11类接口集,开发者不仅能够在网页上使用微信本身的拍照、选图、语音、位置等基本能力,还可以直接使用微信分享、扫一扫、卡券、支付等微信特有的能力,为微信用户提供更优质的网页体验。

微信JS-SDK提供的11类接口(分享接口、图像接口、音频接口、智能接口、设备信息、界面操作、地理位置、微信扫一扫、微信小店、微信卡券、微信支付)在使用方式上完全相同,唯一需要注意的是,这11类接口并不是都开放的,有些接口非认证用户是没有权限的,比如分享接口,小店接口、卡券接口、支付接口则必须通过微信认证后才能使用。具体权限问题可参考你的接口权限表

开发前提

  • 开发者ID (应用ID和应用密匙)
  • 在公众号(服务号)设置——功能设置(JS接口安全域名)中填写已备案的域名
  • 服务器环境
  • 简单的后台知识,如PHP
  • linux服务器,请确保目录有可写权限

本文以php为例

首先在微信开发者平台下载它的示例代码,链接中包含php、java、nodejs以及python的示例代码供第三方参考,这里使用php包。我把php文件夹重命名为weixin放在网站根目录下,如图:

微信公众平台开发 JS-SDK开发

保存图片到本地服务器

因为涉及到上传到本地服务器,所以还需要一个api接口(api.php),简单展示下上传保存代码:

后端服务

//保存为同级目录下api.php
require_once './config/app.php';
require_once './config/wexin.php';

//curl
function getcurl($url, $data=array()){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch) ;
    return $response;
}

/**
 * 获取微信access_token
 */
function get_access_token () {
    global $wxConfig;
    $url = "https://api.weixin.qq.com/cgi-bin/token";
    $data = array(
        'grant_type'=>'client_credential',
        'appid'=> $wxConfig['appId'],
        'secret'=> $wxConfig['appSecret']
    );
    $file = getcurl($url,$data);
    $josn = json_decode($file,true);
    $token = $josn['access_token'];
  if($token){
      return $token;
  }else{
      return null;
  }
}

/**
 * 上传图片
 * @param media_id
 */
function upload($media_id) {
  $access_token = get_access_token();
  if (!$access_token) return false;
  $url = "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=".$access_token."&media_id=".$media_id;
  if (!file_exists(UPLOAD_PATH)) {
      mkdir('./upload/', 0775, true); //将图片保存到upload目录
  }
  $fileName = date('YmdHis').rand(1000,9999).'.jpg';
  $targetName = './upload/'. $fileName;

  $ch = curl_init($url);
  $fp = fopen($targetName, 'wb');
  curl_setopt($ch, CURLOPT_FILE, $fp); // 设置输出文件的位置,值是一个资源类型
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_exec($ch);
  curl_close($ch);
  fclose($fp);
  return '/upload/'.$fileName; //输出文件名
}

/**
 * 输出json
 */
function toJson ($code = 200, $data = array(), $message = 'success') {
  return json_encode(array('code' => $code, 'data' => $data, 'message' => $message));
}

if (isset($_GET['api'])) {
  $api = $_GET['api'];
  //上传
  if ($api == 'upload') {
    $mediaId = $_POST['media_id'];
    $file = upload($mediaId);
    if ($file) {
      exit (toJson(200, array('url' => $file)));
    } else {
      exit (toJson(400, null, 'error'));
    }
  }
}

前端页面

再简单修改下sample.php

<?php
require_once './config/app.php';
require_once './config/wexin.php';
require_once "./libs/wexin/jssdk.php";
$jssdk = new JSSDK($wxConfig['appId'], $wxConfig['appSecret']);
$signPackage = $jssdk->GetSignPackage();
?>
<!DOCTYPE html>
<html lang="zh-cmn-Hans">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no">
  <meta name="apple-mobile-web-app-capable" content="yes">
  <meta name="apple-mobile-web-app-status-bar-style" content="blank">
  <meta name="format-detection" content="telephone=no, email=no">
  <link rel="stylesheet" href="./public/css/weui.css" media="screen">
  <title>微信上传DEMO</title>
</head>

<body>
  <article>
   <a class="weui-btn weui-btn_plain-primary upload-toggle" id="js-upload">上传图片</a>
   <figure><img src="" id="js-preview"></figure>
 </article>

 <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
 <script src="./public/js/zepto.min.js"></script>
 <script>
    wx.config({
        debug: true,
        appId: '<?php echo $signPackage["appId"];?>',
        timestamp: <?php echo $signPackage["timestamp"];?>,
        nonceStr: '<?php echo $signPackage["nonceStr"];?>',
        signature: '<?php echo $signPackage["signature"];?>',
        jsApiList: [
          // 所有要调用的 API 都要加到这个列表中
          "chooseImage",
          "previewImage",
          "uploadImage",
          "downloadImage"
          ]
    });

    wx.ready(function() {
          /**
           * [weixinUpload 调用微信接口实现上传]
           * @param  {[function]} choose [选择图片后的回调]
           * @param  {[function]} upload [上传后的回调]
           */
          function weixinUpload(choose, upload) {
            wx.chooseImage({
              count: 1,
              sizeType: ['original', 'compressed'],
              sourceType: ['album', 'camera'],
              success: function(res) {
                var localIds = res.localIds;
                choose && choose(localIds); //选择图片后回调
                // 上传照片
                wx.uploadImage({
                  localId: '' + localIds,
                  isShowProgressTips: 1, //开启上传进度
                  success: function(res) {
                    serverId = res.serverId;
                    upload && upload(serverId); //上传图片后回调
                  }
                });
              }
            });
          }

          /**
           * [uploadImage 上传图片到本地服务器]
           * @param  {[type]}   mediaId  [图片serverID]
           * @param  {Function} callback [回调]
           */
          function uploadImage(mediaId, callback) {
            $.ajax({
              type: "POST",
              url: "api.php?api=upload",
              data: {
                media_id: serverId
              },
              dataType: "json",
              success: function(result) {
                if (result.code == 200) {
                  callback(result.data);
                } else {
                  alert("上传失败!");
                }
              },
              error: function() {
                alert("系统异常,请稍后重试");
              }
            });
          }

          var $uploadButton = $('#js-upload')
          var $uploadPreview = $('#js-preview')

          //点击上传按钮
          $uploadButton.on('click', function() {
            weixinUpload(
              function(localIds) {
                $uploadPreview.attr('src', localIds); //微信本地图片地址,可以用来做上传前预览
              },
              function(serverId) {
                uploadImage(serverId, function(data) {
                  $uploadPreview.attr('src', data.url); //返回真实的图片地址
                });
              }
            );
          })
    });
</script>
</body>
</html>

好了,将修改后的代码连同新建的api.php同时上传到服务器。该服务器域名必须和你在微信设置中的域名一致。我上传到了根目录,通过firefox提供的页面二维码功能,在微信上扫一扫即可测试。截图如下:

微信上传图片测试

图片说明

  • [图一] 表示我们的微信配置正确
  • [图二] 点击 上传图片 按钮后弹出 拍照从手机相册选择 等功能按钮
  • [图三] 进入了手机相册
  • [图四] 选择一张图片后,返回该图片的localId
  • [图五] 利用localId作为图片预览,并且生成了serverID
  • [图六] api 上传并保存了图片到本地服务器,返回图片在本地服务器的地址,并且回调在了页面上

小结

通过以上两个简单的例子,基本可以掌握微信JS-SDK的使用方法。11个接口使用方式基本相同,你可以一一尝试。官方的说明是:
通过ready接口处理成功验证
通过error接口处理失败验证
所有接口通过wx对象(也可使用jWeixin对象)来调用,参数是一个对象,除了每个接口本身需要传的参数之外,还有以下通用参数:

  • success:接口调用成功时执行的回调函数。
  • fail:接口调用失败时执行的回调函数。
  • complete:接口调用完成时执行的回调函数,无论成功或失败都会执行。
  • cancel:用户点击取消时的回调函数,仅部分有用户取消操作的api才会用到。
  • trigger: 监听Menu中的按钮点击时触发的方法,该方法仅支持Menu中的相关接口。

具体可参考官方API。

时间: 2024-10-30 10:06:55

微信公众平台开发 JS-SDK开发(图像接口实例)的相关文章

PHP使用Face++接口开发微信公众平台人脸识别系统的方法_php实例

本文实例讲述了PHP使用Face++接口开发微信公众平台人脸识别系统的方法.分享给大家供大家参考.具体如下: 效果图如下: 具体步骤如下: 首先,先登录Face++的官网注册账号:官网链接 注册之后会获取到api_secret和api_key,这些在调用接口的时候需要用到. 然后接下来的就是使用PHP脚本调用API了. 在使用PHP开发微信公共平台的时候,推荐使用Github上的一款不错的框架:wechat-php-sdk 对于微信的常用接口做了一些封装,核心文件wechat.class.php

《微信公众平台与小程序开发——从零搭建整套系统》——导读

目 录 第1章 微信生态 第1章第1节微信:是一种生活方式第1章第2节微信公众平台第1章第3节企业号第1章第4节小程序第1章第5节微信开放平台第1章第6节微信支付第1章第7节表情开放平台第1章第8节微信广告第1章第9节小结 第2章 开发环境及技术介绍 第3章 开发前的准备 第4章 常用调试方法及工具 第5章 基于CodeIgniter的微信公众平台开发框架 第6章 微信网页开发 第7章 微信支付 第8章 微信登录 第9章 微信小程序 第10章 案例:第一个echo server程序 第11章 案

微信公众平台增加批量获取用户基本信息接口

为了帮助开发者提高效率,微信公众平台的用户管理接口中,新增了批量获取用户基本信息的接口.   同时,为了保障公众号第三方平台的业务运营,该接口已放入用户管理权限集中.只要公众号将该权限集授权给第三方平台(包括历史授权的公众号),第三方平台就可以帮助它调用该接口. 获取用户基本信息(UnionID机制) 在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众 号,同一用户的openid不同).公众号可通过本接口来根

微信公众平台开发文档 客服接口

当用户主动发消息给公众号的时候(包括发送信息.点击自定义菜单click事件.订阅事件.扫描二维码事件.支付成功事件.用户维权),微信将会把消息数据推送给开发者,开发者在一段时间内(目前修改为48小时)可以调用客服消息接口,通过POST一个JSON数据包来发送消息给普通用户,在48小时内不限制发送次数.此接口主要用于客服等有人工消息处理环节的功能,方便开发者为用户提供更加优质的服务. 接口调用请求说明 http请求方式: POST https://api.weixin.qq.com/cgi-bin

《微信公众平台应用开发实战(第2版)》一导读

前 言 为什么要写这本书 截至本书完成时,微信已有超过6亿的用户,公众平台给了我们接触这6亿用户的机会.公众平台对于我们来说是一个全新的平台,任何人都可以在公众平台上注册一个账号并进行自己的探索,这意味着大家的机会都是平等的.和大家一样,笔者也是众多探索者中的一个.在本书的第1版完成时,公众平台只开放了一些非常简单的接口,给到开发者的自由度很有限.截至目前,公众平台不仅开放了9大高级接口,还开放了支付接口,可以支持到闭环的用户体验. 关于机会,唐骏在新书<重新出发>中给出了他的理解:"

php版微信公众平台接口开发之智能回复开发教程_php实例

本文实例讲述了php版微信公众平台接口开发之智能回复功能实现方法.分享给大家供大家参考,具体如下: 智能回复是根据用户输入的条件来反馈结果用用户了,这个小编以前有做过信整理了一些例子供各位参考,比较完整主要是介绍在开发端了. 微信自推出后,着实火了一把,而支付功能的推出,又把微信推到了一个无可比拟的高度,然后申请微信订阅号或者服务号的人也开始比肩接踵.下面我将给大家简单讲解下微信公众平台开发接口. 先去 微信公众平台 申请账号,然后按照提示一步步.在选择订阅号和服务号上,个人只能申请订阅号,而且

php版微信公众平台接口开发之智能回复开发教程

本文实例讲述了php版微信公众平台接口开发之智能回复功能实现方法.分享给大家供大家参考,具体如下: 智能回复是根据用户输入的条件来反馈结果用用户了,这个小编以前有做过信整理了一些例子供各位参考,比较完整主要是介绍在开发端了. 微信自推出后,着实火了一把,而支付功能的推出,又把微信推到了一个无可比拟的高度,然后申请微信订阅号或者服务号的人也开始比肩接踵.下面我将给大家简单讲解下微信公众平台开发接口. 先去 微信公众平台 申请账号,然后按照提示一步步.在选择订阅号和服务号上,个人只能申请订阅号,而且

微信公众平台开发模式详解图文教程

如果对本篇教程有任何疑问或错漏之处欢迎留言或直接联系我进行更正修改. 开发模式详解图文教程-公众平台发送图文教程"> 首先我们要明确开发模式什么可以做,什么不可以做: 一.开发模式可以实现的功能 可以接收用户发送过来的消息,通过你自己开发的系统把对应内容反馈回去. 可以接收用户发送过来的地理位置,通过地理位置你可以反馈附近餐厅信息或交通信息(例如高德地图) 通过事件推送,可以识别用户对公众帐号订阅和取消订阅操作的情况. 开发模式的接口除了可以反馈图文消息,也可以反馈音频内容给用户. 可以通

微信公众平台天气预报功能开发_php实例

本来是想自己直接从中国天气网获取信息并处理,后来发现处理起来太麻烦,而且要获取所有城市的城市编码,再有就是!不支持国外天气!!(我们学校有很多毕业生在国外上学,所以我考虑还是做出支持国外天气的版本) 因此考虑直接调用别人的API,一开始选用了方倍工作室已经做好的接口(无奈也没有国外).直到有一天返回北京天气温度是零下的时候(当时天热到不敢出门)...换!换!换! 后来终于发现最靠谱的接口----百度的天气API. 废话少说,首先大家要上 百度地图API申请一个专用key(大概一分钟就搞定了,很方

微信公众平台消息接口开发(10)语音触发(非识别)

微信公众平台消息接口开发 微信公众平台开发模式 语音识别 天气预报 天气神 方倍工作室 作者:http://www.cnblogs.com/txw1958/  本系统教程以微信公众平台应用天气神(账号WeatherGod,支持国内近400个城市天气的名称.拼音.区号.邮编以及语音触发模式查询)为例,讲解微信接口开发过程.欢迎大家关注该账号并使用语音方式查询当地天气,二维码见底部.   一.通过输入文字的方式查询天气一般都是通过城市名称.拼音.区号等方式实现的查询,基本上都是搜索数据库,获得对应的