微信公众号网页及 JS-SDK 开发

wechat oap message service

微信公众号除了提供基于消息的信息组织、管理和发布方式外,还可以通过开发用户自定义网页来深入定制公众号的信息交互功能。公众号网页采用标准的HTML/JS/CSS语言开发,除了传统的开发方式外,微信也提供了相应的接口(JS-SDK)和工具(Web开发者工具)来方便网页功能的开发。

这里先介绍一下JS-SDK,这是微信公众平台提供的一套访问微信特定功能的接口,比如分享、扫码、拍照、位置、语音、支付等功能。网页中使用微信的这些功能,需要通过调用公众平台接口来实现。访问这些接口,微信提供了一套标准的方法,下面以测试号来详细说明一下。

一、JS-SDK使用配置

申请好的测试号,需要配置一下JS接口安全域名,就是自己服务器的域名,到公众号管理后台,选择“开发者工具-web开发者工具”,输入域名即可(无http|https)。标准公众号(需认证)的配置方法是类似的。

二、定制网页(调用JS-SDK接口)

定制网页就按照需求写相应的代码即可,这里主要是详细介绍一下如何在网页中调用JS-SDK的接口。按照微信的要求,首先需要对调用接口的网页注入授权验证,这个是通过调用JS-SDK的wx.config()函数完成的,里面有一个主要的参数就是“signature”(签名),出于安全的考虑,签名需要从后端生成后给前端网页授权使用。

根据所调用接口的不同,后端生成签名时需要的几个主要参数包括:noncestr(随机串)、ticket(js-sdk接口使用票据,通过access_token获取)、timestamp(时间戳)、url(需要调用接口的网页链接),下面给出示例代码(python):

jssdk.py #生成签名,redissession代码参看这篇文章

import time
import config
from wechatpy.utils import random_string
from wechatpy import WeChatClient
from redisclient import redissession

class jsSDK:
    def getJsSdk(self, url):
            appId = config.appId #测试号的appId和secret在公众号后台可查到
            secret = config.secret
            noncestr = random_string() #生成随机串
            timestamp = int(time.time()) #生成时间戳

            client = WeChatClient(appId, secret, session=redissession)
            ticket = client.jsapi.get_jsapi_ticket() #生成接口访问票据
            signature = client.jsapi.get_jsapi_signature(noncestr, ticket, timestamp, url) #生成签名
            return {'appId': appId, 'timestamp': str(timestamp), 'nonceStr': noncestr, 'signature': signature, 'url': url} #返回签名等数据供前端使用

homepage.py #生成js-sdk接口调用的网页,使用了web.py的模板引擎

import web
from jssdk import jsSDK

class HomePage:
      def GET(self):
              #使用了层次模板base.html,后面有定义
              render = web.template.render('templates', base='base')
              url = web.ctx.home + web.ctx.fullpath
              jssdk = jsSDK().getJsSdk(url)
              #渲染home.html模板
              return render.home('Hello world', '首页', jssdk)

templates/home.html #首页模板

$# jssdk 是从homepage.py传入的。生成调用接口参数传给层次模板base.html
$def with (name, title, jssdk)
$var title: $title
$var appId: $jssdk['appId']
$var timestamp: $jssdk['timestamp']
$var nonceStr: $jssdk['nonceStr']
$var signature: $jssdk['signature']
$var url: $jssdk['url']
<div class="weui-panel__bd">
    <a aria-labelledby="js_p1m1_bd" href="javascript:" class="weui-media-box weui-media-box_appmsg">
        <div aria-hidden="true" class="weui-media-box__hd">
            <img class="weui-media-box__thumb" src="https://www.kflyo.com/wp-content/uploads/..." alt="">
        </div>
        <div aria-hidden="true" id="js_p1m1_bd" class="weui-media-box__bd">
            <strong class="weui-media-box__title">$name</strong>
            <p class="weui-media-box__desc">由各种物质组成的巨型球状天体,叫做星球。星球有一定的形状,有自己的运行轨道。</p>
        </div>
    </a>
    <a aria-labelledby="js_p1m2_bd" href="javascript:" class="weui-media-box weui-media-box_appmsg">
        <div aria-hidden="true" class="weui-media-box__hd">
            <img class="weui-media-box__thumb" src="https://www.kflyo.com/wp-content/uploads/..." alt="">
        </div>
        <div aria-hidden="true" id="js_p1m2_bd" class="weui-media-box__bd">
            <strong class="weui-media-box__title">标题</strong>
            <p class="weui-media-box__desc">由各种物质组成的巨型球状天体,叫做星球。星球有一定的形状,有自己的运行轨道。</p>
        </div>
    </a>
</div>

templates/base.html #层次模板,根据内嵌的模板参数,生成相应的微信js-sdk接口调用代码,本例演示的是“分享”接口。

$def with (page)
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0">
        <title>客飞翱\
            $if page.title: : $page.title\
        </title>
        <link rel="stylesheet" href="https://res.wx.qq.com/open/libs/weui/2.3.0/weui.min.css"/>
        <script charset="utf-8" src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
        <script type="text/javascript">
            $#鉴权代码
            wx.config({
                debug: true,
                appId: '$page.appId',
                timestamp: $page.timestamp,
                nonceStr: '$page.nonceStr',
                signature: '$page.signature',
                jsApiList: [
                    'checkJsApi',
                    'updateAppMessageShareData',
                    'updateTimelineShareData'
                ]
            });
            wx.ready(function() {
                $#分享接口调用代码
                wx.updateAppMessageShareData({
                    title: '分享的文章',
                    desc: '测试分享到朋友接口',
                    link: '$page.url',
                    imgUrl: 'https://www.kflyo.com/wp-content/uploads/...',
                    success: function () {
                        alert('ok')
                    }
                });
            });
            wx.error(function(res) {
                alert('error')
            });
        </script>
    </head>
    <body>
        <h1><a href="https://www.kflyo.com/" class="weui-btn weui-btn_primary">博客网站</a></h1>
            $:page
    </body>
</html>

index.py #加入微信公众号首页响应代码

import sys
import web
from handle import Handle
from setupmenu import Menu
from homepage import HomePage

sys.path.append('/home/user/webpy')
menu = Menu()
menu.create()

urls = (
    '/weixin', 'Handle',
    '/weixin/index.html', 'HomePage',
)

app = web.application(urls, globals())

if __name__ == '__main__':
    app.run()

application = app.wsgifunc()

这样在微信中访问首页https://www.example.com/weixin/index.html 时,调出分享菜单,点击“转发给朋友”按钮,就可以把首页分享给朋友了,朋友打开微信就能看到定义好的分享内容。代码中只写了分享功能,其它接口功能的调用方法是一样的,根据官网的接口说明生成代码即可。

发表评论

邮箱地址不会被公开。 必填项已用*标注