文档章节

微信SDK的使用经验

小星星_cjx
 小星星_cjx
发布于 2017/04/27 17:06
字数 2323
阅读 25
收藏 0
点赞 0
评论 0

一、使用前的准备工作

步骤一:绑定域名

先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。

备注:登录后可在“开发者中心”查看对应的接口权限。

步骤二:引入js文件

在需要调用接口的页面引用:http://res.wx.qq.com/open/js/jweixin-1.0.0.js

需要注意的地方:如果页面启用了https,务必引入: https://res.wx.qq.com/open/js/jweixin-1.0.0.js 

步骤三:通过config接口注入权限验证配置

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

步骤四:通过ready接口处理成功验证

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

步骤五:通过error接口处理失败验证

wx.error(function(res){
    // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
});

二、在项目中的配置说明

    1、绑定域名

        绑定域名是项目负责人去弄的事情,我写代码时,用的是一个测试域名,是同事帮我用ngrok工具配置的,也可以在买,应该有很多方法吧。

        测试功能时,需要在这个网站配置相关信息:

        http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index

        进入上面的网址,用微信扫码登录,会得到下面的信息:

        微信号:"......"  、appID:"......."

        将测试域名填入这个页面的“JS接口安全域名”,即可进行测试,测试使用“微信web开发者工具

    2、引入JS文件

require(['http://res.wx.qq.com/open/js/jweixin-1.2.0.js'],function(wx){
  //开始你的代码
})

    3、通过config接口注入权限验证配置

        在我参与的项目中,是后台同事配置的,然后提供一个接口,调用这个接口即可拿到这些数据进行配置,接口文档如下:

获取微信JS-SDK中TicketToken以及签名信息

POST /api/weixin/getTicketToken

参数:

1. ghId, ##公众号原始ID
2. url, ##需要调用js-sdk的页面地址,是全地址,包括http

example:

参数:

{
"param":{
  "ghId":"gh_c4e032e50bcc",
  "url":"http://adminte.xiaoyinghui.cn/index.html?param=aaa"
 }
}
返回:

{
    "msg":"查询成功",
    "code":"0",
    "data":{       
        "appId":"wxdc97aac88c438930",
        "timestamp":"1481629113",
        "nonceStr":"af98eb9a-1969-4306-984c-0df9d597449f",
        "signature":"cbd8ea61d00f8fd2d31d0b1e32750340c321d1b2"
    }
}
返回data中的参数说明

 appId: '', // 公众号的唯一标识
 timestamp: , // 生成签名的时间戳
 nonceStr: '', // 生成签名的随机串
 signature: '',// 签名,

        案例代码:

var sendData = {
  "param": JSON.stringify({
    "ghId": "", //公众号原始ID,微信号
    "url": window.location.href //页面全地址
   })
};
ece.post(ece.url.user.register.checkWxConfig, sendData).suc(function (result) {
  if(0 == result.code){
    wx.config({
      debug: false,
      appId: result.data.appId,
      timestamp: result.data.timestamp,
      nonceStr: result.data.nonceStr,
      signature: result.data.signature,
      jsApiList:[
        'getLocation', //获取地理位置接口
        'chooseImage', //拍照或从手机相册中选图接口
        'uploadImage', //上传图片接口
        'chooseWXPay' //发起支付请求接口
        'scanQRCode', //调起微信扫一扫接口
      ]
    });
  }
}).err(function (result) {

});

三、在实际项目中用到的点

    1、定位

        获取地理位置接口:

wx.getLocation({
    type: 'wgs84', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
    success: function (res) {
        var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
        var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
        var speed = res.speed; // 速度,以米/每秒计
        var accuracy = res.accuracy; // 位置精度
    }
});

        说明:调用微信SDK定位,获取到的只是当前位置的经度和维度等信息,我们需要将它换算成城市的信息。在这里,我调用了后台提供的接口,传入经度和纬度等参数到后台,会返回对应的省、城市名称给我:

wx.ready(function () {
  $(".add-msg").on("touch click",function () { //点击按钮调用,获取当前位置信息
    wx.getLocation({
      type: 'wgs84',
      success: function (res) {
        var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
        var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
        var speed = res.speed; // 速度,以米/每秒计
        var accuracy = res.accuracy; // 位置精度
        
        //调用接口,将经纬度换算成城市
        ece.get(ece.url.user.register.getLocation.replace(":x",latitude).replace(":y",longitude))
        .suc(function (result) {
          if(0 == result.code){
            $(".add-msg").text(result.data.province + result.data.city);   
          }else{
            console.log(result.msg);
          }
         }).err(function () {
           console.log("服务器异常");
         })
      },
      cancel: function (res) {
        console.log('用户拒绝授权获取地理位置');
      },
      fail: function (res) {  //定位失败
        alert("请检查是否已开启GPS服务");
      }
    });
  });
});

    2、拍照/上传照片

        拍照或从手机相册中选图接口:

wx.chooseImage({
    count: 1, // 默认9
    sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
    sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
    success: function (res) {
        var localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
    }
});

       上传图片接口:

wx.uploadImage({
    localId: '', // 需要上传的图片的本地ID,由chooseImage接口获得
    isShowProgressTips: 1, // 默认为1,显示进度提示
    success: function (res) {
        var serverId = res.serverId; // 返回图片的服务器端ID
    }
});

         在这里,我是先调起拍照功能或从手机相册选择照片,再将照片上传到服务器,再从服务器中拿:        

wx.ready(function(){
  $(".camera").on("touch click", function () { //点击拍照
    wx.chooseImage({
      count: 1,
      sourceType: ['camera'],
      success: function (res) {
        //上传图片接口
        wx.uploadImage({
          localId: res.localIds[0], // 需要上传的图片的本地ID,由chooseImage接口获得
          isShowProgressTips: 1, // 默认为1,显示进度提示
          success: function (res) {
            var serverId = res.serverId; // 返回图片的服务器端ID
            ece.get(ece.url.common.upImgToFileHost + '/' + serverId).suc(function(res){
              if('0' === res.code){
                $(".vipimg").attr("src", ece.url.common.getFile + '/' + res.data);
              }
            });
            //为避免时间太久,可以先将选择好的图片赋值到指定位置
            $(".vipimg").attr("src", res.localIds);
          }
        });
      }
    });
  });
  $(".chooseimg").on("touch click", function () { //点击添加图片
    wx.chooseImage({
      count: 1,
      sourceType: ['album'],
      success: function (res) {
        //上传图片接口
        wx.uploadImage({
          localId: res.localIds[0], // 需要上传的图片的本地ID,由chooseImage接口获得
          isShowProgressTips: 1, // 默认为1,显示进度提示
          success: function (res) {
            var serverId = res.serverId; // 返回图片的服务器端ID
            ece.get(ece.url.common.upImgToFileHost + '/' + serverId).suc(function(res){
              if('0' === res.code){
                $(".vipimg").attr("src", ece.url.common.getFile + '/' + res.data);
              }
            });
            //为避免时间太久,可以先将选择好的图片赋值到指定位置
            $(".vipimg").attr("src", res.localIds);  
          }
        });
      }
    });
  });
})

    3、微信支付

       参考文档:https://pay.weixin.qq.com/wiki/doc/api/index.html

WeixinJSBridge.invoke(
  'getBrandWCPayRequest', {
   "appId":"wx2421b1c4370ec43b",     //公众号名称,由商户传入     
   "timeStamp":"1395712654",         //时间戳,自1970年以来的秒数     
   "nonceStr":"e61463f8efa94090b1f366cccfbbb444", //随机串     
   "package":"prepay_id=u802345jgfjsdfgsdg888",     
   "signType":"MD5",         //微信签名方式:     
      "paySign":"70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名 
   },
   function(res){     
     if(res.err_msg == "get_brand_wcpay_request:ok" ) {
       //支付成功后的操作
     }else if(res.err.msg == "get_brand_wcpay_request:cancel"){
       //支付取消后的操作
     }else if(res.err.msg == "get_brand_wcpay_request:cancel"){
       //支付失败后的操作
     }     
  }
); 

        在我参与的项目中,appId、timeStamp、nonceStr、package、signType是通过调用后台提供的接口获取到的:

        一定要注意中文的冒号:和英文的冒号:   !!!

var sendData = {
  "param":JSON.stringify({
  "product_id": payValue.productId,
  "sku_item_id": payValue.skuId,
  "sku_item_num": $(".num").val(),
  "is_account": acc,
  "children_info": jsonObj
  })
}
//调用接口,获取需要的数据
ece.post(ece.url.course.detail.putOrder, sendData).suc(function (result) {
  if("0" === result.code){
    WeixinJSBridge.invoke(
	  'getBrandWCPayRequest',{
	    appId: result.data.appId, //公众号名称,由商户传入
		timeStamp: result.data.timeStamp, //时间戳,自1970年以来的秒数
		nonceStr: result.data.nonceStr, //随机串
		package: result.data.package,
		signType: result.data.signType, //微信签名方式:
		paySign: result.data.paySign //微信签名
	  },
	  function(res){
	    if(res.err_msg == "get_brand_wcpay_request:ok" ) {
		  //支付成功后的处理					
        }
	  }
    );
  }
})

    4、微信扫一扫

        调起微信扫一扫接口:

wx.scanQRCode({
    needResult: 0, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
    scanType: ["qrCode","barCode"], // 可以指定扫二维码还是一维码,默认二者都有
    success: function (res) {
    var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
}
});

         在我参与的项目中,扫码成功后直接跳转到结果页面:

wx.ready(function () {
  //点击调起扫一扫
  $(".scanbtn").on("touch click",function () {
    wx.scanQRCode({
      needResult: 0, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
      scanType: ["qrCode","barCode"], // 可以指定扫二维码还是一维码,默认二者都有
      success: function (res) {
        var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
      }
    });
  });
});

 

参考资料:

微信公众平台开发者文档: https://mp.weixin.qq.com/wiki/home/

微信支付开发文档:https://pay.weixin.qq.com/wiki/doc/api/index.html

 

额外补充:如何使用js设置或获取当前页面的地址

window.location.hash 设置或获取 href 属性中在井号“#”后面的分段
window.location.host 设置或获取 location 或 URL 的 hostname 和 port 号码
window.location.hostname 设置或获取 location 或 URL 的主机名称部分
window.location.href 设置或获取整个 URL 为字符串
window.location.pathname 设置或获取对象指定的文件名或路径
window.location.port 设置或获取与 URL 关联的端口号码
window.location.protocol 设置或获取 URL 的协议部分
window.location.search 设置或获取 href 属性中跟在问号后面的部分

© 著作权归作者所有

共有 人打赏支持
小星星_cjx
粉丝 0
博文 23
码字总数 18543
作品 0
广州
前端工程师
快讯 发现微信支付的重大漏洞,白帽子先联系了360……

  随着微信支付逐渐向海外市场普及,越来越多的外国友人及店铺开始使用微信支付。不过却发生了一件有趣的事情,国外一名白帽子发现了微信支付的漏洞,但却不知道如何联系微信安全的人员,竟...

FreeBuf
07/03
0
0
免sdk实现微信/支付宝转账打赏功能

安卓开发者都应该有一个属于自己的APP发布到市场,可以完善自己的技术站之外,加入广告,还可以有一份小收入。 但是这个年代,各家的应用市场是不欢迎带广告sdk的个人开发者应用的。还好我们...

CankingApp
2017/09/21
0
0
【系列】序—直播疑难杂症排查

在七牛做直播 SDK 一年多了,帮助客户解决过各种形形色色的问题,如直播卡顿、马赛克、花屏、黑屏、杂音、音画不同步等等等等,这其中,有一些是网络原因,有一些是客户的使用姿势问题,有一...

七仙女很忙
2017/04/13
0
0
超仿微信Android版--凡信

本项目的IM通信部分是基于环信的SDK开发的。对于个人开发者或者小企业来说,做IM用第三方的也是一种趋势吧,毕竟自己整一套可供运营使用的IM系统几乎是不切实际的(技术门槛和维护成本)。之...

红薯
2015/05/06
7.3K
4
将HTML5封装成android应用APK文件的几种方法

作为下一代的网页语言,HTML5拥有很多让人期待已久的新特性。HTML5的优势之一在于能够实现跨平台游戏编码移植,现在已经有很多公司在移动 设备上使用HTML5技术。随着HTML5跨平台支持的不断增...

QQ2205357007
2017/05/21
0
0
app分享功能开发

最近在开发一个社交平台的app需要用到分享功能,本来想自己开发的,在网上花了很长时间查了很多教程结果却不尽人意,无意中看到还有类似的开源组件友推,结合自己的开发经验,把一些集成步骤...

我要编程
2014/08/12
192
5
vue 项目如何引入微信sdk,使用微信分享接口

写在前面: 做微信的网页基本上都要接入微信的sdk,我在做的时候,也颇费了一番功夫,然后就想记录一下,供自己日后翻阅,以及让有需要的朋友可以做一下参考,如果喜欢的可以点波赞,或者关注...

OB丶Koro1
2017/12/18
0
0
急聘【前端工程师(RN方向)】1名 月薪15K-30K /月

前端工程师(RN方向) 1名 月薪15K-30K /月 岗位职责: 1、不断完善移动端APP应用的优化,基于RN来进行开发,提升用户体验和更新迭代; 2、参与产品需求分析并制定技术实施方案; 3、根据产品...

holison
2017/11/22
0
0
Jeewx捷微 , 免费微信公众账号管家系统发布,采用JAVA语言

JeeWx, 微信管家平台,简称“捷微”. 捷微是一款免费开源的JAVA微信公众账号开发平台. 当前最新版本: 2.3(发布日期:20160323) 一、捷微Jeewx简介 Jeewx是一个开源、高效、敏捷的微信开发...

Jeecg
2016/03/24
248
0
微信JS SDK Demo 官方案例

微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包。 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系统的能力,同时可以直接使...

大道至精
2015/01/14
0
38

没有更多内容

加载失败,请刷新页面

加载更多

下一页

idea tomcat 远程调试

tomcat 配置 编辑文件${tomcat_home}/bin/catalina.sh,在文件开头添加如下代码。    CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7829" Idea端配......

qwfys
今天
1
0
遍历目录下的文件每250M打包一个文件

#!/usr/bin/env python # -*- utf-8 -*- # @Time : 2018/7/20 0020 下午 10:16 # @Author : 陈元 # @Email : abcmeabc@163.com # @file : tarFile.py import os import tarfile import thr......

寻爱的小草
今天
1
0
expect同步文件&expect指定host和要同步的文件&构建文件分发系统&批量远程执行命令

20.31 expect脚本同步文件 expect通过与rsync结合,可以在一台机器上把文件自动同步到多台机器上 编写脚本 [root@linux-5 ~]# cd /usr/local/sbin[root@linux-5 sbin]# vim 4.expect#!/...

影夜Linux
今天
1
0
SpringBoot | 第九章:Mybatis-plus的集成和使用

前言 本章节开始介绍数据访问方面的相关知识点。对于后端开发者而言,和数据库打交道是每天都在进行的,所以一个好用的ORM框架是很有必要的。目前,绝大部分公司都选择MyBatis框架作为底层数...

oKong
今天
13
0
win10 上安装解压版mysql

1.效果 2. 下载MySQL 压缩版 下载地址: https://downloads.mysql.com/archives/community/ 3. 配置 3.1 将下载的文件解压到合适的位置 我最终将myql文件 放在:D:\develop\mysql 最终放的位...

Lucky_Me
今天
2
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

问题终结者
今天
2
0
expect脚本同步文件expect脚本指定host和要同步的文件 构建文件分发系统批量远程执行命令

expect脚本同步文件 在一台机器上把文件同步到多台机器上 自动同步文件 vim 4.expect [root@yong-01 sbin]# vim 4.expect#!/usr/bin/expectset passwd "20655739"spawn rsync -av ro...

lyy549745
今天
1
0
36.rsync下 日志 screen

10.32/10.33 rsync通过服务同步 10.34 linux系统日志 10.35 screen工具 10.32/10.33 rsync通过服务同步: rsync还可以通过服务的方式同步。那需要开启一个服务,他的架构是cs架构,客户端服务...

王鑫linux
今天
1
0
matplotlib 保存图片时的参数

简单绘图 import matplotlib.pyplot as pltplt.plot(range(10)) 保存为csv格式,放大后依然很清晰 plt.savefig('t1.svg') 普通保存放大后会有点模糊文件大小20多k plt.savefig('t5.p...

阿豪boy
今天
3
0
java 8 复合Lambda 表达式

comparator 比较器复合 //排序Comparator.comparing(Apple::getWeight);List<Apple> list = Stream.of(new Apple(1, "a"), new Apple(2, "b"), new Apple(3, "c")) .collect(......

Canaan_
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部