zoukankan      html  css  js  c++  java
  • 跟我一起,利用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_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocols]
    
    [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsMulti-Protocol Unified Hello]
    
    [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsMulti-Protocol Unified HelloClient]
    "Enabled"=dword:00000000
    "DisabledByDefault"=dword:00000001
    
    [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsMulti-Protocol Unified HelloServer]
    "Enabled"=dword:00000000
    "DisabledByDefault"=dword:00000001
    
    [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsPCT 1.0]
    
    [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsPCT 1.0Client]
    "Enabled"=dword:00000000
    "DisabledByDefault"=dword:00000001
    
    [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsPCT 1.0Server]
    "Enabled"=dword:00000000
    "DisabledByDefault"=dword:00000001
    
    [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsSSL 2.0]
    
    [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsSSL 2.0Client]
    "DisabledByDefault"=dword:00000001
    "Enabled"=dword:00000000
    
    [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsSSL 2.0Server]
    "Enabled"=dword:00000000
    "DisabledByDefault"=dword:00000001
    
    [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsSSL 3.0]
    
    [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsSSL 3.0Client]
    "Enabled"=dword:00000000
    "DisabledByDefault"=dword:00000001
    
    [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsSSL 3.0Server]
    "Enabled"=dword:00000000
    "DisabledByDefault"=dword:00000001
    
    [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.0]
    
    [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.0Client]
    "Enabled"=dword:00000001
    "DisabledByDefault"=dword:00000000
    
    [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.0Server]
    "Enabled"=dword:00000001
    "DisabledByDefault"=dword:00000000
    
    [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.1]
    
    [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.1Client]
    "DisabledByDefault"=dword:00000000
    "Enabled"=dword:00000001
    
    [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.1Server]
    "DisabledByDefault"=dword:00000000
    "Enabled"=dword:00000001
    
    [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.2]
    
    [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.2Client]
    "DisabledByDefault"=dword:00000000
    "Enabled"=dword:00000001
    
    [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.2Server]
    "Enabled"=dword:00000001
    "DisabledByDefault"=dword:00000000
    View Code

     2、代码下载

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

  • 相关阅读:
    JAVA学习之常用集合List,Set,Map
    【收藏】SQL多行变一列
    sql 多个字段分组,删除重复记录,保留ID最小的一条
    【转】 JavaScript:history.go() 的妙用(转) 处理post回发后返回
    【转】SQL SERVER 2005中如何获取日期(一个月的最后一日、上个月第一天、最后一天、一年的第一日等等)
    require.context实现自动化导入文件
    Vue进阶——解析V-MODEL
    ES6 的遍历器接口 Iterator
    必须掌握的ES6新特性
    Vue自定义指令获取DOM元素
  • 原文地址:https://www.cnblogs.com/zhuyue/p/8253741.html
Copyright © 2011-2022 走看看