小程序对接插件

使用豆信开发的插件,在ApiController中实现了供小程序对接的Api,在小程序开发过程中,要对接豆信插件,需要一些特殊的设置,比如请求header头里面需要包含接口请求凭证ak、sk参数等。为了方便开发者在小程序中进行Api联调,豆信提供了一个封装好的util.js,开发者需要在小程序根目录创建一个ext.js并填写好与豆信后台对接的参数,在需要对接Api请求的页面js文件中,只需要引入util.js文件,并且使用封装的util.request()方法即可。

例如下面的调用会发送请求到:http://dev.douchat.net/addon/Demo/api/getDiaryList/mpid/4

  • pages/account/release/release.js
  1. var app = getApp();
  2. var util = require('../../../utils/util.js');
  3. util.init();
  4. Page({
  5. data: {
  6. diaryList: null
  7. },
  8. onLoad: function () {
  9. var that = this;
  10. util.request({
  11. url: 'getDiaryList',
  12. method: 'get',
  13. success: function(res) {
  14. console.log(res)
  15. if (res && res.items) {
  16. that.setData({
  17. diaryList: res.items
  18. });
  19. }
  20. }
  21. });
  22. }
  23. });
  • ext.js
  1. module.exports = {
  2. apiType: 1, // 手动接入的方式
  3. apiBase: {
  4. domain: 'http://dev.douchat.net',
  5. mpid: 4,
  6. addon: 'Demo',
  7. version: '0.4.0',
  8. ak: 'LOFWZR7jPrahA1ZJkeLX1c5qMCQMSqRq',
  9. sk: 'a48xboHhOpQIpnEl1KnzCRyGRWWMLhxMWZz4QCM1QTg'
  10. }
  11. }
  • util.js
  1. var apiBase = {
  2. domain: '',
  3. mpid: 0,
  4. addon: '',
  5. version: '',
  6. ak: '',
  7. sk: ''
  8. };
  9. // 初始化
  10. function init() {
  11. var ext = require('../ext.js')
  12. if (ext && ext.apiType == 1) { // 手动接入的方式
  13. apiBase = ext.apiBase;
  14. }
  15. }
  16. // 发起请求
  17. function request(options) {
  18. var url = options.url || ''; // 请求地址
  19. if (url.indexOf('http') != 0) { // 通过相对地址发起请求
  20. url = apiBase.domain + '/addon/' + apiBase.addon + '/api/' + url + '/mpid/' + apiBase.mpid;
  21. }
  22. var data = options.data || {}; // 请求数据
  23. var header = options.header || {}; // 请求头
  24. if (!header['content-type']) {
  25. header['content-type'] = 'application/x-www-form-urlencoded';
  26. }
  27. if (!header['ak']) {
  28. header['ak'] = apiBase.ak;
  29. }
  30. if (!header['sk']) {
  31. header['sk'] = apiBase.sk;
  32. }
  33. if (!header['version']) {
  34. header['version'] = apiBase.version;
  35. }
  36. if (!header['User-Token']) {
  37. header['User-Token'] = wx.getStorageSync('userToken');
  38. }
  39. var method = (options.method || 'get').toUpperCase(); // 请求方式
  40. var dataType = options.dataType || 'json'; // 请求数据的格式
  41. var responseType = options.responseType || 'text'; // 响应数据格式
  42. wx.request({
  43. url: url,
  44. method: method,
  45. data: data,
  46. header: header,
  47. dataType: dataType,
  48. responseType: responseType,
  49. success: function(res) {
  50. if (options.success && typeof options.success == 'function') {
  51. options.success(res.data);
  52. }
  53. },
  54. fail: function(res) {
  55. if (options.fail && typeof options.fail == 'function') {
  56. options.fail(res.data);
  57. }
  58. },
  59. complete: function(res) {
  60. if (options.complete && typeof options.complete == 'function') {
  61. options.complete(res.data);
  62. }
  63. }
  64. });
  65. }
  66. // 获取配置
  67. function getSettings(cb, refresh) {
  68. var settings = wx.getStorageSync('settings');
  69. if (!settings || refresh == true) {
  70. request({
  71. url: 'getSettings',
  72. method: 'get',
  73. success: function (res) {
  74. if (res && res.errcode == 0 && res.items) {
  75. wx.setStorageSync('settings', res.items);
  76. if (typeof cb == 'function') {
  77. cb(res.items);
  78. }
  79. }
  80. }
  81. });
  82. } else {
  83. if (typeof cb == 'function') {
  84. cb(settings);
  85. }
  86. }
  87. }
  88. // 获取用户信息
  89. function getUserInfo(cb, refresh) {
  90. if (refresh == true) {
  91. login(cb)
  92. } else {
  93. var userInfo = wx.getStorageSync('userInfo');
  94. if (typeof cb == 'function') {
  95. cb(userInfo);
  96. }
  97. }
  98. }
  99. // 登录检测
  100. function checkLogin(options) {
  101. wx.checkSession({
  102. success: function() {
  103. var userInfo = wx.getStorageSync('userInfo');
  104. var userToken = wx.getStorageSync('userToken');
  105. if (!userInfo || !userToken) {
  106. if (options && typeof options.fail == 'function') {
  107. options.fail();
  108. }
  109. } else {
  110. request({
  111. url: 'isLogin',
  112. method: 'post',
  113. header: {
  114. 'User-Token': userToken
  115. },
  116. success: function (res) {
  117. if (res && res.errcode == 0) { // 登录有效
  118. if (options && typeof options.success == 'function') {
  119. options.success();
  120. }
  121. } else {
  122. if (options && typeof options.fail == 'function') {
  123. options.fail();
  124. }
  125. }
  126. },
  127. fail: function () {
  128. if (options && typeof options.fail == 'function') {
  129. options.fail();
  130. }
  131. }
  132. });
  133. }
  134. },
  135. fail: function() {
  136. if (options && typeof options.fail == 'function') {
  137. options.fail();
  138. }
  139. }
  140. });
  141. }
  142. // 用户登录
  143. function login(cb) {
  144. wx.login({
  145. success: function(res) { // 本地登录成功
  146. wx.getUserInfo({ // 获取用户信息
  147. success: function(ret) {
  148. request({ // 远程登录
  149. url: 'login',
  150. method: 'post',
  151. data: {
  152. code: res.code,
  153. encryptedData: ret.encryptedData,
  154. iv: ret.iv
  155. },
  156. success: function(data) {
  157. if (data.errcode == 0 && data.items) { // 登录成功
  158. // 缓存用户信息和登录态sk
  159. wx.setStorageSync('userInfo', data.items.user_info);
  160. wx.setStorageSync('userToken', data.items.user_token);
  161. if (typeof cb == 'function') {
  162. cb(data.items.user_info);
  163. }
  164. } else {
  165. loginFail();
  166. }
  167. },
  168. fail: function() {
  169. loginFail();
  170. }
  171. });
  172. },
  173. fail: function() {
  174. loginFail();
  175. }
  176. });
  177. },
  178. fail: function() { // 登录失败
  179. loginFail();
  180. }
  181. });
  182. }
  183. // 登录失败
  184. function loginFail() {
  185. wx.showModal({
  186. content: '登录失败,请允许获取用户信息,如不显示请删除小程序重新进入',
  187. showCancel: false
  188. });
  189. }
  190. function showTip(sms, icon, fun, t) {
  191. if (!t) {
  192. t = 1000;
  193. }
  194. wx.showToast({
  195. title: sms,
  196. icon: icon,
  197. duration: t,
  198. success: fun
  199. })
  200. }
  201. function showModal(c, t, fun) {
  202. if (!t)
  203. t = '提示'
  204. wx.showModal({
  205. title: t,
  206. content: c,
  207. showCancel: false,
  208. success: fun
  209. })
  210. }
  211. function formatTime(date) {
  212. var year = date.getFullYear();
  213. var month = date.getMonth() + 1;
  214. var day = date.getDate();
  215. var hour = date.getHours();
  216. var minute = date.getMinutes();
  217. var second = date.getSeconds();
  218. return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':');
  219. }
  220. function formatNumber(n) {
  221. n = n.toString();
  222. return n[1] ? n : '0' + n
  223. }
  224. module.exports = {
  225. formatTime: formatTime,
  226. init: init,
  227. checkLogin: checkLogin,
  228. login: login,
  229. getSettings: getSettings,
  230. getUserInfo: getUserInfo,
  231. request: request,
  232. showTip: showTip,
  233. showModal: showModal
  234. };