微信JSSDK前端应用教程

一、配置公众号
①基本配置
首先,你得有一个微信公众号,然后登陆微信公众平台 https://mp.weixin.qq.com/
基本配置中的AppID和AppSecret后面都会用到
服务器配置的相关内容由后端配置

②公众号设置-功能设置



设置JS安全域名,一个自然月内最多可以修改并保存3次

③开发者工具-web开发者工具
绑定一波微信号,绑定之后才能使用web开发者工具


④接口权限-网页服务-网页账号-网页授权获取用户基本信息
填写授权回调页面域名


④微信支付-开发配置
授权目录需要在JS安全域名下
测试的话,测试号需要加入白名单
前端应用不同的框架,设置目录的方式也不同

  1. JQ
    授权目录直接截取页面url,http至最后一个”/“中间的内容
  2. AngularJS
    angular为SPA,只有第一次进入页面会引起全页面刷新,而之后的所有操作均是SPA内部的路由变换,只会引起哈希变化。
    IOS和Android识别支付页面url的机制不同,IOS识别的是全页面刷新的url,Android识别的是发起支付请求页面的url,举个栗子,用户进入项目主页A,之后通过点击操作,最终在页面B发起支付请求,IOS识别的支付url还是页面A的url,而Android识别的是页面B的url,所以需要针对两个系统,设置两套不同的支付授权目录。用angularJS开发的时候,我们往往会将页面参数直接拼在url中的"/"后面,然而微信并不能智能识别后面的参数,将参数改成?a=xx&b=xx的形式就可以了。如果一个项目中,有多个支付页面,建议将所有页面放在一个目录下,那么针对Android只需要设置一个总的目录就行了。


⑤微信JS-SDK说明文档
https://mp.weixin.qq.com/wiki/11/74ad127cc054f6b80759c40f77ec03db.html 看一波说明书
⑥微信网页开发样式库
http://mp.weixin.qq.com/wiki/2/ae9782fb42e47ad79eb7b361c2149d16.html
WeUI 是一套同微信原生视觉体验一致的基础样式库,由微信官方设计团队为微信内网页开发量身设计,可以令用户的使用感知更加统一

二、微信登陆
html中写好页面,记得先引入微信JS文件

<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script src="https://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>

然后在JS中加上点击事件

//微信登录
$("#wx")[0].onclick = function () {
var WxURL = 'https://open.weixin.qq.com/connect/oauth2/authorize?' +
   'appid={见第一步}' +
   '&redirect_uri=' + {授权之后跳转的网页,路径需在第一步中设置的授权回调页面域名下} +
   '?type=wx' +
   '&response_type=code' +
   '&scope=snsapi_userinfo' +
   '&state=STATE' +
   '#wechat_redirect';
   window.location.href = WxURL
};

登陆微信web开发者工具,点击页面中的微信登陆按钮,就会出现如下授权页面


点击确定之后,会跳转到之前设置的回调页面,同时url中会自动带上微信返回的code和state
http://{回调页面}?type=wx&code={code}i&state={code}#
接下来,我们需要取出url中的code,之后用code向后台请求,获取用户信息,
本来这个操作前端也可以进行,但是微信特意用红字注明提示了,
出于安全考虑,只能由后端来做


正常请求回来的话,就会看到用户的基本信息了

三、微信支付
微信支付有两个版本的接口,以前的微信接口都需要配置wx.config,最新版的微信支付V3接口不需要配置,直接使用就可以了
首先调用后端接口,获取以下微信订单信息



然后用这些参数,直接调取微信支付接口

  function onBridgeReady() {
       WeixinJSBridge.invoke(
           'getBrandWCPayRequest', {
               "appId": "{见第一步}",
               "timeStamp": {后端返回},
               "nonceStr": {后端返回},
               "package": {后端返回},
               "signType": "MD5",
               "paySign": {后端返回},
           },
           function (res) {
               console.log(res.err_code + "  " + res.err_desc + "  " + res.err_msg);
               if (res.err_msg == "get_brand_wcpay_request:ok") {
                   alertFn("充值成功");
               } else if (res.err_msg == "get_brand_wcpay_request:cancel") {
                   alertFn("用户取消支付");

               } else if (res.err_msg == "get_brand_wcpay_request:fail") {
                   alertFn("支付失败");
               }
           }
       );
   }

需要注意的是,微信支付接口并不能直接在微信web开发者工具中模拟,会提示{ "errMsg": "没有此SDK或暂不支持此SDK模拟" }
此时就需要用到微信web开发者工具的移动调试功能,Android手机按照下图所示方法连接上手机后,在手机中打开微信页面,电脑上就可以实时模拟出效果,并且可以查看network和console,打断点调试,不过这功能似乎不太稳定,有时候network和console里面会显示一片空白。相比Android,IOS调试的功能就弱化很多,能看到页面html,看不到展示的效果,能看到network,打不了断点,所以微信开发,还是建议用Android进行调试。


附上官方demo:
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6

四、微信红包提现
跟微信支付类似,其实官网文档上的大部分步骤都是在后端进行,前端只用各种调接口就行了

function withdraw() {
       $.ajax({
           type: "POST",
           url: "{后台接口}",
           data: {
               "userId": {用户id},
               "account": {用户uuid},
               "openid": {用户unionid},
               "drawFee": {订单金额},
               "actName": "{活动名称}",
               "wishing": "{祝福语}"
           },
           dataType: "json",
           success: function (res) {
               alert("请求成功");
           },
           error: function () {
               alert("请求失败");
           }
       });
   }

附上官方demo:
https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_5

五、微信分享
除了微信授权登录和微信支付之外,其他的微信接口,都需要先配置config



config中最重要的一个参数就是signature,需要先获得token,然后用token换取ticket,再按照规定的方式组合成签名,

具体方法详见 https://mp.weixin.qq.com/wiki/11/74ad127cc054f6b80759c40f77ec03db.html 附录1
同理,token操作还是由后端进行, 前端只需要传个url给后端,获取签名,再用签名来配置就行

这个签名经常一言不合就报错,官方文档也给出了排查方案



第6条说,url需要encode,但是实际操作的过程中,发现并不需要,加上反而会报错,可能是因为向后台get签名的时候,自动encode了
配置好之后,就可以直接调用分享接口了



内容很简单,需要注意的是,这里调用接口,只是修改的微信右上角菜单里面自带的分享功能的文案,并不是直接调用就可以触发分享操作
分享的触发还是只能点右上角的菜单

六、微信图片
微信提供了选择图片,上传图片、预览图片、下载图片4个接口,跟上面的分享一样,config配置好之后,就可以直接调用,这里以修改头像为例,来谈一下具体逻辑

// 微信-修改头像
var images = {
   localId: [],
   serverId: []
};
vm.chooseImage = function () {
   wx.chooseImage({
       success: function (res) {
           images.localId = res.localIds;
           wx.uploadImage({
               localId: images.localId[0],
               success: function (res) {
                   vm.media(res.serverId);  //将微信服务器id传给后台
               },
               fail: function (res) {
                   alert(JSON.stringify(res));
               }
           });
       }
   });
};

//将微信服务器id传给后台
vm.media = function (mediaId) {
   otherService.media({
       mediaId: mediaId
   }).then(function (res) {
       if (res.data.code == 0) {
           console.log(res);
           vm.changeAvatar(res.data.data.url);
       } else {
           alert(res.data.message);
       }
   });
};

//上传头像
vm.changeAvatar = function (img) {
   userService.put({
       img: img
   }).then(function (res) {
       if (res.data.code == 0) {
           vm.user.img = img;
           vm.errorMsg = "修改成功";
           commonUtil.clearErrorMsg(vm);
       } else {
           vm.errorMsg = "修改失败";
           commonUtil.clearErrorMsg(vm);
       }
   });
};

用户点击按钮后,调用选择图片接口,手机底部会弹出模态框,拍照或者从手机相册选择,这个页面是自带的,不用自己写
选中图片之后,微信会返回一个图片localId,然后调用图片上传接口,将本地图片上传至微信服务器,微信返回serverId,
这个Id并不能直接使用,需要将id传给后端,后端用这个id去微信服务器下载图片,并返回图片url,前端再用这个url去调用图片上传接口,
就可以实现修改头像功能。

七、官方demo
http://203.195.235.76/jssdk/

PS:上面的代码分别来自两个不同的项目,所以风格不一致,不要在意细节~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 226,197评论 6 524
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 97,254评论 3 410
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 173,718评论 0 370
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,801评论 1 305
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,732评论 6 404
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 54,200评论 1 318
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,389评论 3 433
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 41,484评论 0 282
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,024评论 1 328
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,013评论 3 352
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,125评论 1 359
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,698评论 5 353
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,407评论 3 342
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,795评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,996评论 1 278
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,724评论 3 384
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,150评论 2 368

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,532评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,759评论 18 139
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,138评论 4 61
  • 作为一个广告的学生,我想大概所有广告的前辈都会推荐我们读一本叫做《一个广告人的自白》的书吧,我认识的一个广告的前辈...
    15刘航阅读 264评论 0 0
  • 我叫阿九,是一个不知名的二本的学生。 上大学之前,别人说大学生活很丰富,很愉快。我信了。 16周幼儿园+2周高三=...
    阿九小叔阅读 359评论 0 1