跟我一起,利用bitcms内容管理系统从0到1学习小程序开发:二、与服务端通信,Hello bitcms!

上篇分享 跟我一起,利用bitcms内容管理系统从0到1学习小程序开发:一、IIS下SSL环境搭建,SSL环境搭建完成,本次分享主要是与服务端建立通信。

一、微信小程序设置

登录微信小程序管理后台获取AppID和AppSecret,进入路径为:设置->开发设置

服务器域名设置,微信目前还没有加有效性验证,就先填上吧

二、API接口准备,在bitcms内容管理系统上进行二次开发的准备(注:本过程并不是进行二次开发的全部过程,全过程请参阅官网)

1、新建项目,推荐开发环境VS2012以上版本,.NET Frameworks选4.5以上版本。

2、把bitcms内容管理系统,最好是安装版文件复制并覆盖新建好的项目。

3、删除App_Start中的路由配置文件RouteConfig.cs;global删除Global.asax.cs,并从项目排除出去;添加bitcms.Core.dll引用。这些完成之后就招按F5可以运行,测试项目是否合并成功,再进行安装。

4、新建API控制器,继承bitcms.UI.BaseApiController基类,添加helloworld方法。保存,上传到测试服务器。bitcms.UI.BaseApiController基类里有对API调用签名的验证。签名的生成规则是请求的所有非空参数和appid,appsecret,时间戳timestamp(自1970年以来的秒数)和随机数nonce,按参数名字母顺序进行md5加密。

//
// GET: /API/
public JsonResult helloworld()
{
    return this.getResult(bitcms.Entity.Error.请求成功, "hello bitcms!");
}
//
// GET: /API/
[HttpPost]
[ValidateInput(false)]
public JsonResult sayhello(string name)
{
    return this.getResult(bitcms.Entity.Error.请求成功, string.Format( "hello {0}!",name));
}

 三、签名算法

1、bitcms内容管理系统后台添加微信小程序API模块,路径为:bitcms后台->系统设置->系统设置->模块管理。为方便大家测试,此appid和appsecret就不马赛克了,共大家测试用。不用手抄,下面代码里有提供。

2、使用微信web开发者工具,新建项目bitcms内容管理系统测试项目。

添加工具类:utils.js,api.js,md5.js

utils.js为常用的js操作函数

const formatTime = date => {
  const year = date.getFullYear()
  const month = date.getMonth() + 1
  const day = date.getDate()
  const hour = date.getHours()
  const minute = date.getMinutes()
  const second = date.getSeconds()

  return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
}

const formatNumber = n => {
  n = n.toString()
  return n[1] ? n : '0' + n
}
/**时间戳 1970年以来的秒数 */
var timestamp = function () {
  return Date.parse(new Date()) / 1000;
}
//获取随机数
var random = function (n) {
  n = n ? n : 8;
  var chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
  var res = "";
  for (var i = 0; i < n; i++) {
    var index = Math.ceil(Math.random() * (chars.length - 1));
    res += chars[index];
  }
  return res;
}
//json数据合并
var extend = function (target, source) {
  for (var p in source) {
    if (source.hasOwnProperty(p)) {
      target[p] = source[p];
    }
  }
  return target;
};

module.exports = {
  formatTime: formatTime,
  timestamp: timestamp,
  random: random,
  extend: extend,
}

 

api.js为api调用类

/**
 * api调用置文件
 */
var md5 = require('md5.min.js');
var utils = require('utils.js');
// 此处为bitcms系统测试地址,真实可用,先提供大家测试用,什么时候结束,暂不可知
var host = 'https://demo.bitcms.net';
var appId = 'ATAIYGzwrVSKv9Yj';//api appid
var appSecret = '31f9b38ff2094810961a18e6441ed566';//

var url = {
  // 下面的地址配合Demo 工作
  host,
  // helloworld,GET/POST请求,不需要参数
  helloworld: `${host}/api/helloworld`,
  // helloworld,POST请求,参数 string name
  sayhello: `${host}/api/sayhello`
};

/**获取签名 */
var getSign = function (parms) {
  var sortparms = '';
  if (parms && typeof (parms) == 'object') {
    var keys = Object.keys(parms);
    keys.push('appsecret');//appsecret不作为参数向服务器提交
    keys.sort();
    var i = 0;
    for (i in keys) {
      var val = parms[keys[i]] == undefined ? '' : parms[keys[i]] + '';
      if (keys[i] == 'appsecret') {
        val = appSecret;
      }
      if (val != '') {
        if (sortparms.length > 0) {
          sortparms += '&';
        }
        sortparms += keys[i] + '=' + val;
      }
    }
  }
  //md5加密
  return md5(sortparms);
};
/* 向服务器请求或提交数据
parms 为小程序请求对象参数
fun为请求成功后的回调数据
*/
var request = function (parms, fun) {
  if (!(typeof (parms) == 'object' && parms.url)) {//parms必须为object格式类型数据,且必须提供url属性
    if (typeof (fun) == 'function') {
      fun({ error: 1, message: '通信错误' });
    } else {
      throw Error('参数错误');
    }
  }
  var data = parms.data ? parms.data : {};
  var keys = Object.keys(data);
  var i = 0;
  for (i in keys) {
    if (typeof (data[keys[i]]) == 'string') {//encodeURI 防止提交html,js等代码,服务器出错
      data[keys[i]] = encodeURIComponent(data[keys[i]]);
    }
  };
  //提交数据,添加paddid,时间戳,随机数
  utils.extend(data, {
    appid: appId,
    timestamp: utils.timestamp(),
    nonce: utils.random()
  });

  //sign签名
  utils.extend(data, {
    sign: getSign(data)
  });
  //提交请求
  wx.request(utils.extend({
    data: data,
    header: { "Content-Type": "application/x-www-form-urlencoded" },
    success: function (res) {
      turnResult(res, fun);
    },
    fail: function (res) {
      turnResult(res, fun);
    }
  }, parms));
};
//返回数据处理
var turnResult = function (res, fun) {
  if (res.data && res.data.error == 0) {
    if (typeof (fun) == 'function') {
      if (res.data) {
        fun(res.data);
      } else {
        fun();
      }
    } else {
      var msg = res.message || '成功';
      wx.showToast({
        title: msg,
        icon: 'success',
        duration: 2000
      });
    }
  } else if (res.data) {
    if (typeof (fun) == 'function') {
      fun(res.data);
    } else {
      var msg = res.message || '请求失败';
      wx.showToast({
        image: '/images/icon/error.png',
        title: msg,
        duration: 2000
      });
    };
  } else {
    if (typeof (fun) == 'function') {
      fun({ error: 1, message: '通信错误' });
    } else {
      wx.showToast({
        image: '/images/icon/error.png',
        title: '通信错误',
        duration: 2000
      });
    };
  }
};

module.exports = { url: url, request: request };

 

四、服务请求 wx.request

1、在api.js中对服务器请求进行了函数封装,在调用的时候就很简单了。

2、由于对服务器进行请求的回调函数需要对data进行赋值,把this放到一个变量里了。

3、在使用的使用,需要添加api的引用。如: var api = require("../../utils/api.js");

GET请求

    var that = this;
    api.request({ url: api.url.helloworld, method: 'GET' }, function (data) {
      that.setData({ helloworld: data.message });
    });

 

POST带参请求

    var that = this;
    api.request({ url: api.url.sayhello, method: 'POST', data: { 'name': that.data.name} }, function (data) {
      that.setData({ youname: decodeURIComponent( data.message) });
    });

 

五、小记

 1、小程序必须使用 HTTPS 请求,并TLS 必须支持 1.2 及以上版本。server 2008默认只支持1.0版本。我在网上找到一个修改注册表的方法,下面是原文。粘贴到记事本上,保存成后缀是.reg格式的文件,双击导入注册即可(修改注册表有风险,导入前请 备份注册表)

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\Multi-Protocol Unified Hello]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\Multi-Protocol Unified Hello\Client]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\Multi-Protocol Unified Hello\Server]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\PCT 1.0]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\PCT 1.0\Client]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\PCT 1.0\Server]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client]
"DisabledByDefault"=dword:00000001
"Enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Client]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client]
"Enabled"=dword:00000001
"DisabledByDefault"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server]
"Enabled"=dword:00000001
"DisabledByDefault"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server]
"Enabled"=dword:00000001
"DisabledByDefault"=dword:00000000
View Code

 2、代码下载

百度网盘:链接:https://pan.baidu.com/s/1qZU4WgO 密码:sojk

posted @ 2018-01-12 17:45  逐月  阅读(523)  评论(0编辑  收藏  举报