首頁 > 微信小程式 > 小程式開發 > 詳解小程式開發登陸、付款和範本訊息的實例

詳解小程式開發登陸、付款和範本訊息的實例

Y2J
發布: 2017-05-11 13:29:28
原創
2556 人瀏覽過

本篇文章主要是介紹了微信小程式-微信登陸、微信支付、範本訊息,具有一定的參考價值,有需要的可以了解一下。

微信公眾平台近日悄悄開始內測微信小程式(微信公眾號)功能,引來無數開發者和普通用戶關注,微信支付的能力,是隨著小程式的發布一併推出的,具有介紹如下:

wx.login(OBJECT)

呼叫介面取得登入憑證(code)進而換取使用者登入狀態訊息,包含使用者的唯一識別(openid) 及本次登入的會話金鑰(session_key)。使用者資料的加解密通訊需要依賴會話金鑰完成。

OBJECT參數說明:

success傳回參數說明:

範例程式碼:

//app.js
App({
 onLaunch: function() {
  wx.login({
   success: function(res) {
    if (res.code) {
     //发起网络请求
     wx.request({
      url: 'https://test.com/onLogin',
      data: {
       code: res.code
      }
     })
    } else {
     console.log('获取用户登录态失败!' + res.errMsg)
    }
   }
  });
 }
})
登入後複製

code換取session_key

這是一個HTTP 接口,開發者伺服器使用登入憑證code 來取得session_key 和openid。其中 session_key 是對使用者資料進行加密簽署的金鑰。為了自行應用安全性,session_key 不應該在網路上傳輸。

介面位址:

api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

請求參數

傳回參數:

#回傳說明:

//正常返回的JSON数据包
{
   "openid": "OPENID",
   "session_key": "SESSIONKEY"
   "expires_in": 2592000
}
//错误时返回JSON数据包(示例为Code无效)
{
  "errcode": 40029,
  "errmsg": "invalid code"
}
登入後複製

登入態維護

透過wx.login() 取得到使用者登入態之後,需要維護登入態。開發者要注意不應該直接把 session_key、openid 等欄位當作使用者的標識或 session 的標識,而應該自己派發一個 session 登入態(請參考登入時序圖)。對於開發者自己產生的 session,應該保證其安全性且不應該設定較長的過期時間。 session 派發到小程式用戶端之後,可儲存在 storage ,用於後續通訊使用。

登入時序圖

wx.checkSession(OBJECT)

檢查登陸態是否過期

範例程式碼:

wx.checkSession({
 success: function(){
  //登录态未过期
 },
 fail: function(){
  //登录态过期
  wx.login()
 }
})
登入後複製

使用者資料的簽章驗證與加上解密

資料簽章校驗

為了確保開放介面回傳使用者資料的安全性,微信會對明文資料進行簽署。開發者可以根據業務需求對資料包進行簽章校驗,確保資料的完整性。

  • 簽署校驗演算法涉及使用者的session_key,透過 wx.login 登入流程取得使用者session_key,並自行維護與應用自身登入態的對應關係。

  • 透過呼叫介面(如wx.getUserInfo)取得資料時,介面會同時傳回rawData、signature,其中signature = sha1( rawData + session_key )

  • 開發者將signature、rawData 傳送到開發者伺服器進行校驗。伺服器利用使用者對應的 session_key 使用相同的演算法計算出簽章 signature2 ,比對 signature 與 signature2 即可校驗資料的完整性。

如wx.getUserInfo的資料校驗:

介面傳回的rawData:

{
 "nickName": "Band",
 "gender": 1,
 "language": "zh_CN",
 "city": "Guangzhou",
 "province": "Guangdong",
 "country": "CN",
 "avatarUrl": "http://wx.qlogo.cn/mmopen/vi_32/1vZvI39NWFQ9XM4LtQpFrQJ1xlgZxx3w7bQxKARol6503Iuswjjn6nIGBiaycAjAtpujxyzYsrztuuICqIM5ibXQ/0"
}
登入後複製

使用者的session-key:

HyVFkGl5F5OQWJZZaNzBBg==

所以,用於簽章的字串為:

{
 "nickName": "Band",
 "gender": 1,
 "language": "zh_CN",
 "city": "Guangzhou",
 "province": "Guangdong",
 "country": "CN",
 "avatarUrl": "http://wx.qlogo.cn/mmopen/vi_32/1vZvI39NWFQ9XM4LtQpFrQJ1xlgZxx3w7bQxKARol6503Iuswjjn6nIGBiaycAjAtpujxyzYsrztuuICqIM5ibXQ/0"
}HyVFkGl5F5OQWJZZaNzBBg==
登入後複製

使用sha1得到的結果為

75e81ceda165f4ffa64f4068af58c64b8f54b88c

加密資料解密演算法

#介面如果涉及敏感資料(如wx.getUserInfo當中的openId 和

    ##介面如果涉及敏感資料(如wx.getUserInfo當中的openId 和##unionId ),介面的明文介面的明文內容將不包含這些敏感資料。開發者如需要取得敏感數據,需要對介面傳回的加密資料( encryptedData )進行對稱解密。 解密演算法如下:
  • 對稱解密所使用的演算法為 AES-128-CBC,資料採用PKCS#7填入。
  • 對稱解密的目標密文為Base64_Decode(encryptedData),
  • 對稱解密密鑰aeskey = Base64_Decode(session_key), aeskey 是16位元組

  • 對稱解密演算法初始向量iv 會在資料介面中傳回。 ######

微信官方提供了多种编程语言的示例代码(点击下载)。每种语言类型的接口名字均一致。调用方式可以参照示例。

注:此前提供的加密数据(encryptData)以及对应的加密算法将被弃用,请开发者不要再依赖旧逻辑。

用户信息:

### wx.getUserInfo(OBJECT)

获取用户信息,需要先调用 wx.login 接口。

OBJECT参数说明:

success返回参数说明:

示例代码:

wx.getUserInfo({
 success: function(res) {
  var userInfo = res.userInfo
  var nickName = userInfo.nickName
  var avatarUrl = userInfo.avatarUrl
  var gender = userInfo.gender //性别 0:未知、1:男、2:女 
  var province = userInfo.province
  var city = userInfo.city
  var country = userInfo.country
 }
})
登入後複製

encryptedData 解密后为以下 json 结构,详见加密数据解密算法

{
  "appId": "APPID",
  "openId": "OPENID",
  "nickName": "NICKNAME",
  "gender": 1,
  "city": "CITY",
  "province": "PROVINCE",
  "country": "COUNTRY",
  "avatarUrl": "AVATARURL",
  "unionId": "UNIONID"
}
登入後複製

UnionID机制说明:

如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。

微信开放平台绑定小程序流程

前提:微信开放平台帐号必须已完成开发者资质认证

开发者资质认证流程:

登录微信开放平台(open.weixin.qq.com) – 帐号中心 – 开发者资质认证

微信支付:

wx.requestPayment(OBJECT)
发起微信支付。

Object参数说明:

示例代码:

wx.requestPayment({
  'timeStamp': '',
  'nonceStr': '',
  'package': '',
  'signType': 'MD5',
  'paySign': '',
  'success':function(res){
  },
  'fail':function(res){
  }
})
登入後複製

基于微信的通知渠道,我们为开发者提供了可以高效触达用户的模板消息能力,以便实现服务的闭环并提供更佳的体验。

模板推送位置:服务通知

模板下发条件:用户本人在微信体系内与页面有交互行为后触发,详见下发条件说明

模板跳转能力:点击查看详情仅能跳转下发模板的该帐号的各个页面

使用说明

获取模板 id

登录mp.weixin.qq.com获取模板,如果没有合适的模板,可以申请添加新模板,审核通过后可使用,详见模板审核说明

页面的

组件,属性report-submit为true时,可以声明为需发模板消息,此时点击按钮提交表单可以获取formId,用于发送模板消息。或者当用户完成支付行为,可以获取prepay_id用于发送模板消息。

调用接口下发模板消息(详见接口说明)

接口说明

1. 获取 access_token

access_token 是全局唯一接口调用凭据,开发者调用各接口时都需使用 access_token,请妥善保存。access_token 的存储至少要保留512个字符空间。access_token 的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的 access_token 失效。

公众平台的 API 调用所需的 access_token 的使用及生成方式说明:

  • 为了保密 appsecrect,第三方需要一个 access_token 获取和刷新的中控服务器。而其他业务逻辑服务器所使用的 access_token 均来自于该中控服务器,不应该各自去刷新,否则会造成 access_token 覆盖而影响业务;

  • 目前 access_token 的有效期通过返回的 expires_in 来传达,目前是7200秒之内的值。中控服务器需要根据这个有效时间提前去刷新新 access_token。在刷新过程中,中控服务器对外输出的依然是老 access_token,此时公众平台后台会保证在刷新短时间内,新老 access_token 都可用,这保证了第三方业务的平滑过渡;

  • access_token 的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新 access_token 的接口,这样便于业务服务器在 API 调用获知 access_token 已超时的情况下,可以触发 access_token 的刷新流程。

开发者可以使用 AppID 和 AppSecret 调用本接口来获取 access_token。AppID 和 AppSecret 可登录微信公众平台官网-设置-开发设置中获得(需要已经绑定成为开发者,且帐号没有异常状态)。AppSecret 生成后请自行保存,因为在公众平台每次生成查看都会导致 AppSecret 被重置。注意调用所有微信接口时均需使用 https 协议。如果第三方不使用中控服务器,而是选择各个业务逻辑点各自去刷新 access_token,那么就可能会产生冲突,导致服务不稳定。

接口地址:

api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

HTTP请求方式:

GET

参数说明 :

返回参数说明:

正常情况下,微信会返回下述 JSON 数据包给开发者:

{"access_token": "ACCESS_TOKEN", "expires_in": 7200}
登入後複製

2. 发送模板消息

接口地址:(ACCESS_TOKEN 需换成上文获取到的 access_token)

api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=ACCESS_TOKEN
HTTP请求方式:

POST

POST参数说明:

示例:

{
 "touser": "OPENID", 
 "template_id": "TEMPLATE_ID", 
 "page": "index",     
 "form_id": "FORMID",     
 "data": {
   "keyword1": {
     "value": "339208499", 
     "color": "#173177"
   }, 
   "keyword2": {
     "value": "2015年01月05日 12:30", 
     "color": "#173177"
   }, 
   "keyword3": {
     "value": "粤海喜来登酒店", 
     "color": "#173177"
   } , 
   "keyword4": {
     "value": "广州市天河区天河路208号", 
     "color": "#173177"
   } 
 },
 "emphasis_keyword": "keyword1.DATA" 
}
登入後複製

返回码说明:

在调用模板消息接口后,会返回JSON数据包。

正常时的返回JSON数据包示例:

{
 "errcode": 0,
 "errmsg": "ok",
}
登入後複製

错误时会返回错误码信息,说明如下:

使用效果:

 注意:内部测试阶段,模板消息下发后,在客户端仅能看到由“公众号安全助手”下发的简单通知。能收到该提示,即表明模板消息功能已经调试成功。待该功能正式上线后,将可以展示成上图效果。

 下发条件说明

1、支付

当用户在小程序内完成过支付行为,可允许开发者向用户在7天内推送有限条数的模板消息(1次支付可下发1条,多次支付下发条数独立,互相不影响)

2、提交表单

当用户在小程序内发生过提交表单行为且该表单声明为要发模板消息的,开发者需要向用户提供服务时,可允许开发者向用户在7天内推送有限条数的模板消息(1次提交表单可下发1条,多次提交下发条数独立,相互不影响)

 审核说明

1.标题

1.1标题不能存在相同

1.2标题意思不能存在过度相似 

1.3标题必须以“提醒”或“通知”结尾

1.4标题不能带特殊符号、个性化字词等没有行业通用性的内容

1.5标题必须能体现具体服务场景

1.6标题不能涉及营销相关内容,包括不限于:

消费优惠类、购物返利类、商品更新类、优惠券类、代金券类、红包类、会员卡类、积分类、活动类等营销倾向通知

2.关键词

2.1同一标题下,关键词不能存在相同

2.2同一标题下,关键词不能存在过度相似

2.3关键词不能带特殊符号、个性化字词等没有行业通用性的内容

2.4关键词内容示例必须与关键词对应匹配

2.5关键词不能太过宽泛,需要具有限制性,例如:“内容”这个就太宽泛,不能审核通过

违规说明

除不能违反运营规范外,还不能违反以下规则,包括但不限于:

  1. 不允许恶意诱导用户进行触发操作,以达到可向用户下发模板目的

  2. 不允许恶意骚扰,下发对用户造成骚扰的模板

  3. 不允许恶意营销,下发营销目的模板

  4. 不允许通过服务号下发模板来告知用户在小程序内触发的服务相关内容

处罚说明

根据违规情况给予相应梯度的处罚,一般处罚规则如下:

  1. 第一次违规,删除违规模板以示警告,

  2. 第二次违规,封禁接口7天,

  3. 第三次違規,封鎖介面30天,

  4. 第四次違規,永久封鎖介面

處罰結果及原因以站內信形式告知

【相關推薦】

#1. 微信小程式完整原始碼

2. 微信小程式demo:仿網易雲音樂

#

以上是詳解小程式開發登陸、付款和範本訊息的實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板