2019-11-09 22:48:56 DDDDeng_ 阅读数 49
  • 微信程序开发

    本课程主要介绍如何开发微信小程序,是一门比较基础入门的微信小程序开发课程,本套课程涵盖了大部分的基础内容,使学员们可以尽快的掌握小程序的开发技巧 本套课程大部分可分为如下几个层面 一:小程序的开发工具简介 二:小程序的整体框架及语法基础 三:小程序页面布局 四:小程序组件及API 五:豆瓣电影项目 六:模拟话费充值项目(微信小程序支付功能实现) 七:翡翠商城项目 本套课程需要的一些前期准备为需要下载好微信小程序开发工具,后端需要myeclipse开发工具以及安装jdk8及tomcat8,后端开发主要为java。

    118 人正在学习 去看看 王鹤然

我最近在开发一个微信小程序
先简单介绍一下我的开发工具:
微信开发者工具,eclipse,和Navicat
我是用JAVA写的后端,使用Tomcat web服务器。

	我服务器是使用的是腾讯云服务器,SSL证书是免费版,域名也是腾讯买的。

因为做过WEB项目所以前面开发小程序并不是太难,由于我是小白(学生党),开发经验不足,所以在配置ssl证书这里被卡到了,看了网上很多解决方法,研究了将近一天才解决,所以想记录下来,帮助一下和我一样开接触微信小程序的朋友。

首先腾讯云和阿里云官网都有Tomcat配置SSL证书的方法,大家可以去找找看,先给大家一个链接,下面我再划重点!~
阿里云
https://help.aliyun.com/knowledge_detail/95496.html

最重要的在这里:

<Connector port="8443"
    protocol="HTTP/1.1"
    SSLEnabled="true"
    scheme="https"
    secure="true"
    keystoreFile="cert/a.pfx"
    keystoreType="PKCS12"
    keystorePass="证书密码"
    clientAuth="false"
    SSLProtocol="TLSv1+TLSv1.1+TLSv1.2"
    ciphers="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256"/>

在这里插入图片描述
1.修改代码的位置,注意不要放错,还要注意保存时编码规则,server.xml默认编码规则是utf-8,如果改了编码会报错。
2.解释一下前面的Connector 8080
这是配置Tomcat的端口,就是8080是tomcat的端口,若想访问tomcat,你要输入地址:http://localhost:8080
有的地方此处建议将8080修改为80,
解释一下:
80端口是HTTP服务默认端口,若在TOMCAT的配置文件中修改成80接口,那么只要是http访问他就会默认去访问TOMCAT服务器
输入地址:http://localhost 就可以访问到tom首页(他默认去找80端口,你已经设置了80端口是TOM)
3.同样的道理你可以把<Connector port=“8443”
改为443
因为443是HTTPS服务默认的端口,修改后
你可以输入地址:
http://abcd.com 访问到TOM首页
其中abcd.com是你证书绑定的域名。

如果有其他问题,欢迎大家留言,希望我的记录可以帮到大家~

2019-10-13 23:02:25 weixin_39037804 阅读数 17
  • 微信程序开发

    本课程主要介绍如何开发微信小程序,是一门比较基础入门的微信小程序开发课程,本套课程涵盖了大部分的基础内容,使学员们可以尽快的掌握小程序的开发技巧 本套课程大部分可分为如下几个层面 一:小程序的开发工具简介 二:小程序的整体框架及语法基础 三:小程序页面布局 四:小程序组件及API 五:豆瓣电影项目 六:模拟话费充值项目(微信小程序支付功能实现) 七:翡翠商城项目 本套课程需要的一些前期准备为需要下载好微信小程序开发工具,后端需要myeclipse开发工具以及安装jdk8及tomcat8,后端开发主要为java。

    118 人正在学习 去看看 王鹤然

在上篇随笔《基于微信小程序的系统开发准备工作》介绍了开发微信小程序的一些前期的架构设计、技术路线 、工具准备等方面内容,本篇随笔继续这个步骤,逐步介绍我们实际开发过程中对SSL协议的申请及后期处理过程,包括证书的IIS端口绑定,以及解决“”小程序要求的 TLS 版本必须大于等于 1” 的问题。

1、证书申请及成功的后续处理

小程序的配置要求我们必须在网站提供443端口服务,需要加入HTTPS证书,这种证书可以从云服务商上购买,如腾讯云、阿里云上的云服务器后台都提供了购买证书服务的通道,以阿里云为例,使用阿里云账号登陆后,在【控制台】【安全云盾】【证书服务】里面进行申请。

购买证书,我们在没有太多资金支持的情况下,可以考虑先使用免费SSL证书,阿里云上提供 免费型DV SSL的申请,购买后,会在订单列表里面有一个待审核的订单,如下所示,等待审核通过即可使用。

一般情况下,如果我们填写的资料正确,会较快通过审核的,如果我们的DNS不在万网上,那么我们还需要到服务商的网站进行添加阿里云的DNS配置。通过我们在提交信息的时候,如果是Windows服务器,因此会勾选DNS方式验证,如下所示。

这样提交成功后,会同时在服务器的云解析上面自动增加一条记录,如下所示

如果我们的申请的免费SSL证书获得通过,那么状态会变为【已签发】,如下所示,这个时候就可以用了。

 下载的证书包括几个文件,如下所示。

我们在IIS服务器上双击pfx文件,默认一步步操作即可把证书增加加到对应的目录里面了。

接着我们可以在控制台中查看到对应的证书位置。

然后在IIS里面绑定443端口,选择对应的SSL证书即可完成对SSL证书的绑定了,如下图所示。

这个时候,如果我们访问网站(我们官网是https://www.iqidi.com),那么 就可以在浏览器的左侧看到证书的信息了。

 

2、微信小程序整合处理

为了整合远程HTTPS连接获取数据,我们需要进行部署一个Web API的接口,那么我们可以建立一个进行MVC控制器进行测试,如下我们在控制器里面添加一个方法来获取第三方接口的数据,然后返回来给我们的小程序使用。

例如,我们以连接地址:http://m.maoyan.com/movie/list.json返回的数据为例,这个接口用来获取电影的数据,获得的结果如下所示。

由于小程序对域名的限制,我们不能使用第三方的API接口,因此需要在自己域名内部的API进行封装处理,然后再提供给自己的小程序使用,我们建立一个MVC的控制器方法,如下代码所示。

        /// <summary>
        /// 增加一个域名内的接口,供小程序测试
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ActionResult Movies(int offset = 0, string type = "hot", int limit=6)
        {
            var url = "http://m.maoyan.com/movie/list.json";
            var postData = string.Format("?offset={0}&type={1}&limit={2}", offset,type,limit);

            HttpHelper helper = new HttpHelper();
            string result = helper.GetHtml(url  postData, "", false);
            return Content(result);
        }

这样我们使用Fiddler测试的时候,确信能够获得返回的JSON数据,在进行小程序的测试即可。

执行POST数据的处理,可以获得对应的JSON数据,如下所示。

不过如果我们这个时候整合小程序进行测试,如下代码所示。

onShow: function () {
    var that = this
    wx.request({
      url: 'https://www.iqidi.com/h5/movies',
      data: {
        offset: 0,
        type: 'hot',
        limit: that.data.limit
      },
      method : 'POST',
      header: {
        'Content-Type': 'application/json'
      },
      success: function (res) {
        console.log(res.data)
        that.setData({
          films: res.data.data.movies,
          loading: true
        })
      }
    })

那么上述的处理操作,还是没有能够获取正确的结果的,调试小程序发现,它提示”小程序要求的 TLS 版本必须大于等于 1.2“”。

 

在网站上找到对应的解决方案,测试后正确解决问题:在 PowerShell中运行以下内容, 然后重启服务器

# Enables TLS 1.2 on windows Server 2008 R2 and Windows 7

# These keys do not exist so they need to be created prior to setting values.
md "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2"
md "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server"
md "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client"

# Enable TLS 1.2 for client and server SCHANNEL communications
new-itemproperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server" -name "Enabled" -value 1 -PropertyType "DWord"
new-itemproperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server" -name "DisabledByDefault" -value 0 -PropertyType "DWord"
new-itemproperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" -name "Enabled" -value 1 -PropertyType "DWord"
new-itemproperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" -name "DisabledByDefault" -value 0 -PropertyType "DWord"

# Disable SSL 2.0 (PCI Compliance)
md "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server"
new-itemproperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server" -name Enabled -value 0 -PropertyType "DWord"
# Enables TLS 1.2 on Windows Server 2008 R2 and Windows 7 # These keys do not exist so they need to be created prior to setting values. md "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2" md "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server" md "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" # Enable TLS 1.2 for client and server SCHANNEL communications new-itemproperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server" -name "Enabled" -value 1 -PropertyType "DWord" new-itemproperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server" -name "DisabledByDefault" -value 0 -PropertyType "DWord" new-itemproperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" -name "Enabled" -value 1 -PropertyType "DWord" new-itemproperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" -name "DisabledByDefault" -value 0 -PropertyType "DWord" # Disable SSL 2.0 (PCI Compliance) md "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server" new-itemproperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server" -name Enabled -value 0 -PropertyType "DWord"

这样启动接口,获得数据并在小程序中进行正确展示了。

 


更多专业前端知识,请上【猿2048】www.mk2048.com
2017-05-12 10:06:16 qq_24953751 阅读数 1614
  • 微信程序开发

    本课程主要介绍如何开发微信小程序,是一门比较基础入门的微信小程序开发课程,本套课程涵盖了大部分的基础内容,使学员们可以尽快的掌握小程序的开发技巧 本套课程大部分可分为如下几个层面 一:小程序的开发工具简介 二:小程序的整体框架及语法基础 三:小程序页面布局 四:小程序组件及API 五:豆瓣电影项目 六:模拟话费充值项目(微信小程序支付功能实现) 七:翡翠商城项目 本套课程需要的一些前期准备为需要下载好微信小程序开发工具,后端需要myeclipse开发工具以及安装jdk8及tomcat8,后端开发主要为java。

    118 人正在学习 去看看 王鹤然

最近小程序很火,我们项目组也看到了,这个很火的市场,就开始做了,这里留下我的联系方式,有不懂的朋友可以找我(李森源  qq:929089727)发话不说,直接上代码

服务器环境:

我是购买的云服务器,环境如下:

系统:windows7

Nginx版本:1.4.6


下面开始申请SSL证书

免费SSL证书申请

这里使用的证书申请网址:https://www.pianyissl.com/?i30413


登陆该网址后,选择那个体验版的“免费测试”按钮


点击“确认购买”

输入域名www.youdomain.com,并点击“生成CSR并提交申请”按钮

点击“确定”按钮


这里我选择邮箱验证方式,其它另外两种依照你的个人情况而定,反正就是为了验证域名是不是你的而已。点击“确定”按钮


大约过几分钟,邮箱会收到一封验证邮件,如下图


复制②指向的一串验证码,点击①处的Here链接


输入验证码,点击“Next>”按钮


提示已经输入正确的验证码,点击“Close Window”

大约等到10分钟左右,再次登陆https://www.pianyissl.com,进入个人中心,可以看到已经成功申请SSL证书


点击查看详情


此时你可以点击箭头所指的证书打包下载,然后免费的SSL证书就可以下载到本地了,下载后可以看到SSL压缩包内的

文件,

有各个WEB服务器的证书,你可以根据你WEB服务器的版本选择。



转载:http://blog.csdn.net/mybelief321/article/details/54429314

我们有了ssl证书,下面在nginx上面部署 ,直接上步骤


1.nginx下载,这里没有的朋友可以找我要 (李森源 qq:929089727)也可以在网上找一个

2.下载好nginx后:

在nginx里面新建ssl文件夹 


把你的证书放到里面 这个证书,是在你申请ssl证书里面的nginx 文件夹里面的

3.配置nginx 


我的配置代码



#user  nobody;
worker_processes  1;





#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;


#pid        logs/nginx.pid;






events {
    worker_connections  1024;
}




http {
    include       mime.types;
    default_type  application/octet-stream;


    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';


    #access_log  logs/access.log  main;


    sendfile        on;
    #tcp_nopush     on;
    tcp_nodelay on; #防止网络阻塞


    #keepalive_timeout  0;
    keepalive_timeout  120;
   #fastcgi_buffers 8 128k;
   #send_timeout 60;
#FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;






    #gzip  on;


    server {
        listen       80;
      server_name 127.0.0.1;


        #charset koi8-r;


        #access_log  logs/host.access.log  main;


        location / {
            #root   html;
            #index  index.html index.htm;


#proxy_pass http://paila; 
proxy_redirect off ; 
proxy_set_header Host $host; 
proxy_set_header X-Real-IP $remote_addr; 
proxy_set_header REMOTE-HOST $remote_addr; 
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
client_max_body_size 50m; 
client_body_buffer_size 256k; 
proxy_connect_timeout 1; 
proxy_send_timeout 30; 
proxy_read_timeout 60; 
proxy_buffer_size 256k; 
proxy_buffers 4 256k; 
proxy_busy_buffers_size 256k; 
proxy_temp_file_write_size 256k; 
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404; 
proxy_max_temp_file_size 128m; 


        }


        #error_page  404              /404.html;


        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }


        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}https://hao.rising.cn/?actionid=1618280&b=57




        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}


        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }




    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;


    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}




   


upstream tomcat {
    server localhost:8087 fail_timeout=0;
}




#modify by lee 20160907 for https -s 
server {
listen 443;
server_name localhost;
ssl on;
ssl_certificate      E:/ngx/ssl/server.pem;
ssl_certificate_key  E:/ngx/ssl/server.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDH:AESGCM:HIGH:!RC4:!DH:!MD5:!aNULL:!eNULL;
ssl_prefer_server_ciphers on;
location / {
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-Proto https;
        proxy_redirect off;
        proxy_connect_timeout      240;
        proxy_send_timeout         240;
        proxy_read_timeout         240;
        # note, there is not SSL here! plain HTTP is used
        proxy_pass http://tomcat;
}
}






}


4.tomcat配置


配置地方

<?xml version='1.0' encoding='utf-8'?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at


      http://www.apache.org/licenses/LICENSE-2.0


  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<!-- Note:  A "Server" is not itself a "Container", so you may not
     define subcomponents such as "Valves" at this level.
     Documentation at /docs/config/server.html
 -->
<Server port="8005" shutdown="SHUTDOWN">
  <!-- Security listener. Documentation at /docs/config/listeners.html
  <Listener className="org.apache.catalina.security.SecurityListener" />
  -->
  <!--APR library loader. Documentation at /docs/apr.html -->
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
  <Listener className="org.apache.catalina.core.JasperListener" />
  <!-- Prevent memory leaks due to use of particular java/javax APIs-->
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />


  <!-- Global JNDI resources
       Documentation at /docs/jndi-resources-howto.html
  -->
  <GlobalNamingResources>
    <!-- Editable user database that can also be used by
         UserDatabaseRealm to authenticate users
    -->
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>


  <!-- A "Service" is a collection of one or more "Connectors" that share
       a single "Container" Note:  A "Service" is not itself a "Container", 
       so you may not define subcomponents such as "Valves" at this level.
       Documentation at /docs/config/service.html
   -->
  <Service name="Catalina">
  
    <!--The connectors can use a shared executor, you can define one or more named thread pools-->
    <!--
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" 
        maxThreads="150" minSpareThreads="4"/>
    -->
    
    
    <!-- A "Connector" represents an endpoint by which requests are received
         and responses are returned. Documentation at :
         Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
         Java AJP  Connector: /docs/config/ajp.html
         APR (HTTP/AJP) Connector: /docs/apr.html
         Define a non-SSL HTTP/1.1 Connector on port 8080
    -->
    <Connector port="8087" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="443"  proxyPort="443"/>
    <!-- A "Connector" using the shared thread pool-->
    <!--
    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" />
    -->           
    <!-- Define a SSL HTTP/1.1 Connector on port 8443
         This connector uses the JSSE configuration, when using APR, the 
         connector should be using the OpenSSL style configuration
         described in the APR documentation -->
    <!--
    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" />
    -->


    <!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />




    <!-- An Engine represents the entry point (within Catalina) that processes
         every request.  The Engine implementation for Tomcat stand alone
         analyzes the HTTP headers included with the request, and passes them
         on to the appropriate Host (virtual host).
         Documentation at /docs/config/engine.html -->


    <!-- You should set jvmRoute to support load-balancing via AJP ie :
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">         
    --> 
    <Engine name="Catalina" defaultHost="localhost">


      <!--For clustering, please take a look at documentation at:
          /docs/cluster-howto.html  (simple how to)
          /docs/config/cluster.html (reference documentation) -->
      <!--
      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
      -->        


      <!-- Use the LockOutRealm to prevent attempts to guess user passwords
           via a brute-force attack -->
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <!-- This Realm uses the UserDatabase configured in the global JNDI
             resources under the key "UserDatabase".  Any edits
             that are performed against this UserDatabase are immediately
             available for use by the Realm.  -->
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>


      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">


        <!-- SingleSignOn valve, share authentication between web applications
             Documentation at: /docs/config/valve.html -->
        <!--
        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
        -->


        <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <Valve className="org.apache.catalina.valves.AccessLogValve"   remoteIpHeader="x-forwarded-for"
                  remoteIpProxiesHeader="x-forwarded-by"
                  protocolHeader="x-forwarded-proto"/>


 <Context path="" docBase="Judong_JiJiu.war" reloadable="false"/>


      </Host>
    </Engine>
  </Service>
</Server>



这样就搞定了,

最后:

这是我第一个发表的帖子,没弄好,见谅


2019-02-18 12:59:54 qq_41066066 阅读数 16962
  • 微信程序开发

    本课程主要介绍如何开发微信小程序,是一门比较基础入门的微信小程序开发课程,本套课程涵盖了大部分的基础内容,使学员们可以尽快的掌握小程序的开发技巧 本套课程大部分可分为如下几个层面 一:小程序的开发工具简介 二:小程序的整体框架及语法基础 三:小程序页面布局 四:小程序组件及API 五:豆瓣电影项目 六:模拟话费充值项目(微信小程序支付功能实现) 七:翡翠商城项目 本套课程需要的一些前期准备为需要下载好微信小程序开发工具,后端需要myeclipse开发工具以及安装jdk8及tomcat8,后端开发主要为java。

    118 人正在学习 去看看 王鹤然

微信小程序+Java后台开发

全部代码链接

链接:https://pan.baidu.com/s/1viujpT2EcgA8zFasHicflA
提取码:wcvd

  • 通过这个博客,你可以快速的搭建一个微信小程序前端和后台相连的一个功能,在这里我会详细的解说每一个步骤,就是如何实现小程序的前后台相互关联;因为是实现简易的小程序的某个功能,主要是为了了解小程序前台如何和后台相连,所以在此博客中使用的是本地tomcat服务器。*

使用的工具:

idea
springmvc
微信小程序开发工具
tomcat
微信小程序API
所使用的jar包
我已经上传到百度云盘里了,如果有需要可以去下载
链接:https://pan.baidu.com/s/1KSqQLs9JMWB2SqgVVEwhKw
提取码:9s0s
在这里插入图片描述
1.JAV后端详解

我写后台主要使用的是Java,框架是SSM,由于自己的知识浅薄,只能使用自己已有的知识进行开发学习,因为微信小程序前台和后台数据传输是以Json数据格式传送的,所以建议如果了解过springBoot的话,用它更加方便快捷。

在这里我给大家说一个json数据格式究竟是什么,希望对大家有点帮助!!!

  1. json数据格式
    2.1 jso有两种格式:一个是json对象,另一种是json数组
    2.1.1 json对象:可以理解为Java中对象,是以键值对形式存在的
    例子: {“key”:value, “key1”:value1}
    2.1.2 json数组:
    例子:[{“key”:value,“key”:value}]

首先在idea中创建一个JavaEE项目,具体如何创建,在这里我就不祥解了,如果有不会的,可以去网上搜一艘,在这里我会直接打开我先前创建下个JavaEE项目。

  1. 首先在微信小程序开发工具中新建一个项目,然后再自己所写的某一个页面中,其次在自己页面的wxml文件中编写内容
    web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!--前端控制器-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <!--字符编码-->
    <filter>
        <filter-name>encoding</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>
  1. 其次在src/springmvc.xml编写springMVC的配置文件
    springMVC.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
         http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd"
       default-autowire="byName">

    <!--注解扫描-->
    <context:component-scan base-package="com.zb.lq.controller"/>
    <!--注解驱动-->
    <mvc:annotation-driven></mvc:annotation-driven>
</beans>
  1. 然后在控制器中编写代码
    我的实在DemoController中编写的
    在这里插入图迭代的片描述
    DemoController.java
@Controller
public class DemoController {
    @RequestMapping("getUser")
    @ResponseBody
    public List<String> getUser(){
        List<String> list = new ArrayList<>();
        list.add("中北大学");
        list.add("653");
        list.add("实验室");
        return list;
    }
}

至此,使用Java编写的后台已经基本完成,接下来启动tomcat,测试看是否编写成功
如果出现一下内容,则说明后台编写成功,要以json格式输出,因为小程序前台和后台相连是以json格式输出的

在这里插入图片描述

  1. 我以简单的按钮实现前后台交互:
    index.wxml
<button bindtap='houduanRequest'>获取信息</button>
<view wx:for="{{list}}" wx:fot-item="item">
  姓名:{{item}}
</view>

index.js

//index.js
const app = getApp()

Page({
  data: {
    list:''
  },
  houduanRequest:function(){
    var that = this;
    wx.request({
      url: 'http://localhost:8888/xiaochengxu/getUser',//自己请求的服务器的地址
      method: 'GET',
      header: {
        'content-type': 'application/json' // 默认值
      },
      success: function (req) {
        var list = req.data;
        if (list == null) {
          wx.showToast({
            title: 'ErrorMessage',
            icon: 'false',   //图标
            duration: 1500  //提示的延迟的时间
          })
        } else {
          that.setData({
            list: list
          })
        }
      }
    })
  },

  onLoad: function() {
    
  }, 

})

到此基本的功能代码已经完成了,现在我们开始启动tomcat,进行运行,看看结果究竟是什么…

在这里插入图片描述

在这里插入图片描述
到此,实现小程序前后台相连已经实现了
希望对大家有点帮助!!!

2019-06-08 00:14:36 qq_42197800 阅读数 597
  • 微信程序开发

    本课程主要介绍如何开发微信小程序,是一门比较基础入门的微信小程序开发课程,本套课程涵盖了大部分的基础内容,使学员们可以尽快的掌握小程序的开发技巧 本套课程大部分可分为如下几个层面 一:小程序的开发工具简介 二:小程序的整体框架及语法基础 三:小程序页面布局 四:小程序组件及API 五:豆瓣电影项目 六:模拟话费充值项目(微信小程序支付功能实现) 七:翡翠商城项目 本套课程需要的一些前期准备为需要下载好微信小程序开发工具,后端需要myeclipse开发工具以及安装jdk8及tomcat8,后端开发主要为java。

    118 人正在学习 去看看 王鹤然

用微信小程序实现简单的人工客服

最近在做软件工程的课程设计,选择性的做了微信小程序的简单的人工客服。在这里对该课程设计的原理和实现进行一个讲解,也算做一个总结和笔记,方便自己以后查看、复习和帮助大家的学习。


  • 工具:微信开发者工具、Eclipse、Tomcat、图林机器人V2版、百度AI语音识别
  • 实现原理与过程
    (1)微信小程序获取用户输入的文字、图片或语音消息,发送给Tomcat服务器;
    (2)Tomcat服务器接收到消息后交给对应的servel进行处理。因为微信小程序发送文字消息可以使用GET方式,发送文件必须使用POST方式,所以只用一个Sevlet就可以进行处理。
    (3)Servlet获取GET方式的请求,则调用doGet方法,获取请求携带的用户消息,发送给图林机器人,得到图林机器人的随机回复消息后,返回给微信小程序,显示给用户;
    (4)Servlet获取POST方式的请求,则调用doPost方法,获取微信小程序上传的文件消息,先保存在本地的临时文件夹中,在判断是图片消息还是语音消息。如果是图片消息,仅保存在本地,不做任何处理,只返回给微信小程序一个文字回复,如:“图片我看不懂,你自己看”;如果是语音消息,则发送给百度AI进行语音识别,识别成功,在将结果发送给图林机器人,取得图林机器人的回复后,返回给微信小程序,显示给用户;识别失败,则返回给微信小程序一个文字回复,如:“太吵了,听不清楚。。”;

  • 实现过程

(1)服务器实现:
- 项目结构:
chat
- 导入jar包到lib文件夹下:
lib

- 新建web项目,创建一个Servelt(图中的MyServlet):

servlet部分

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

@WebServlet("/MyServlet")
public class MyServlet extends HttpServlet{
	private static final long serialVersionUID = 1L;
	
	private static final String URL = "http://openapi.tuling123.com/openapi/api/v2";

	private Tuling tuling = new Tuling();
	
	//进行文本聊天
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		String reqMes = request.getParameter("reqMes").toString().trim();
		
//		System.out.println(reqMes);
		
		//将用户发送过来的消息转换成JSON格式
		String reqJson = tuling.getReqJson(reqMes);
		//发送消息到图林机器人,获取图林机器人的回复
		String sendPost = tuling.sendPost(URL, reqJson);
		//获取图林机器人回复的JSON消息中的主要回复内容
		String string = tuling.getResultMeg("[" + sendPost +"]");
		
		System.out.println("get提问: "+reqMes);
		
		System.out.println("回复: "+string);
		
		//返回值给小程序
		//将图林回复的消息string返回给小程序
		PrintWriter out = response.getWriter();
		out.write(string);
		out.flush();
		out.close();
		
//		response.sendRedirect("index.jsp");
	}
	//文件上传
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("上传文件");
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		response.setCharacterEncoding("utf-8");
		
		//调用下面的保存文件的方法
		uploadFile(request, response);

//   在uploadFile方法中实现了上述的   实现过程与原理  中的第四步		

		//语音   小程序API录音后Silk格式转码PCM

	}
	
	//获取微信小程序发送的文件消息,并进行处理
	private void uploadFile(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		//得到服务器的真是磁盘路径
		String realPath = this.getServletContext().getRealPath("/");
		
		File file = new File(realPath+"upload");
		System.out.println(realPath);
		
		//要返回给微信小程序的结果
		String string = "";
		
		
		//磁盘文件工厂
		DiskFileItemFactory factory  = new DiskFileItemFactory();
		factory.setRepository(file);//设置临时文件存放的位置
		factory.setSizeThreshold(1024*1024*10);//上传文件的大小5M
		
		//servlet文件上传对象
		ServletFileUpload upload = new ServletFileUpload(factory);
		try {
			//将普通的request请求转成FileItem的列表集合
			List<FileItem> list = upload.parseRequest(request);
			
			FileItem uploadFile = null;
			//增强型for循环
			for(FileItem item : list) {
				if(item.isFormField()) {//是普通表单元素
					
				}else {//否则说明是文件上传
					uploadFile = item;
				}
			}
			//获取文件后缀
			String name = uploadFile.getName();
			String suffix = name.substring(name.lastIndexOf("."));
			
			//做真正的上传,将临时文件 存储到 指定磁盘位置
			
			//图片或语音要保存的绝对路径
			String skil = "";
			
			if(".silk".equals(suffix)) {
				
				skil = "该语音文件要保存的绝对路径"+suffix;
			}else {
			// 图片文件要保存的绝对路径
				skil = (file+"\\"+UUID.randomUUID()+"."+suffix);
			}
			System.out.println(skil);
			
			// 按保存的文路径创建文件
			File saveFile = new File(skil);
			
			//数据写入保存的文件
			try {
				uploadFile.write(saveFile);
			} catch (Exception e) {
				e.printStackTrace();
			}
			
			// 分别对图片或语音消息进行处理
			if(".silk".equals(suffix)) {
				//处理语音消息
				System.out.println("这是一个语音");
				Sample sample = new Sample();
				string = sample.checkMeg();
				System.out.println(string);
			}else {
				System.out.println("这是一个图片");
				string = "图片自己看,我看不懂";
			}
			
			
			
		} catch (FileUploadException e) {
			e.printStackTrace();
		} finally {
			//  对语音或图片进行不同的回复处理,返回给微信小程序
			if(!"太吵了,听不清楚..".equals(string) && !"图片自己看,我看不懂".equals(string)) {
				System.out.println("将调用图林机器人");
				
				System.out.println("get提问: "+string);
				
				String reqJson = tuling.getReqJson(string);
				
				String sendPost = tuling.sendPost(URL, reqJson);
				
				string = tuling.getResultMeg("[" + sendPost +"]");
				
				
				
				System.out.println("回复: "+string);
				
			}
			
			//返回值给小程序
			PrintWriter out = response.getWriter();
			out.write(string);
			out.flush();
			out.close();
		}
	}
}

图灵机器人部分:

详细解析,查看此文章

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

public class Tuling {
	
	private static final String apikey ="图林机器人apikey";
	
	private static final String uid = "用户id";

	/**
	 * 将输入的信息转换为json对象
	 * @param reqMes
	 * @return
	 */
	public String getReqJson(String reqMes) {
		//请求json
		JSONObject reqJson = new JSONObject();
		//输入类型
		int reqType = 0;
		
		//输入信息json,如文本,图片
		JSONObject perception = new JSONObject();
		
		//输入的信息
		JSONObject inputText = new JSONObject();
		inputText.put("text", reqMes);
		
		perception.put("inputText",inputText);
		
		
		//用户信息
		JSONObject userInfo = new JSONObject();
		userInfo.put("apiKey", apikey);
		userInfo.put("userId", uid);
		
		reqJson.put("reqType", reqType);
		reqJson.put("perception", perception);
		reqJson.put("userInfo", userInfo);
		return reqJson.toString();
	}
	/**
	 * 发送请求
	 * @param url
	 * @param reqJson
	 * @return
	 */
	public String sendPost(String url, String reqJson) {
		String status = "";
		String responseStr = "";
		PrintWriter out = null;
		BufferedReader in = null;
		
		try {
			URL realUrl = new URL(url);
			//打开url连接
			URLConnection urlCon = realUrl.openConnection();
			HttpURLConnection httpUrlConnection = (HttpURLConnection) urlCon;
			
			//设置请求属性
			httpUrlConnection.setRequestProperty("Content-Type", "application/json");
			httpUrlConnection.setRequestProperty("x-adviewrtb-version", "2.1");
			
			//发送post请求必须设置一下两行
			httpUrlConnection.setDoOutput(true);
			httpUrlConnection.setDoInput(true);
			
			//获取URLConnection对象对应的输出流
			out = new PrintWriter(httpUrlConnection.getOutputStream());
			//发送请求参数
			out.write(reqJson);
			//flush输出流的缓冲
			out.flush();
			httpUrlConnection.connect();
			
			//定义BufferedReader输入流来读取URL的响应
			in = new BufferedReader(new InputStreamReader(httpUrlConnection.getInputStream()));
			String line = "";
			while((line = in.readLine())!=null) {
				responseStr += line;
			}
			
			status = new Integer(httpUrlConnection.getResponseCode()).toString();
			
			httpUrlConnection.disconnect();
			
		} catch (IOException e) {
			System.out.println("发送post请求出现异常");
			e.printStackTrace();
		} finally {
			try {
				if(out != null) {
					out.close();
				}
				if(in != null) {
					in.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		return responseStr;
	}
	
	/**
	 * JSONObject将字符串转换为json,取到消息信息
	 * @param tulingStr
	 * @return
	 */
	public String getResultMeg(String tulingStr) {
		JSONObject object = null;
		String strResult = "";
		JSONArray jsonArray = new JSONArray(tulingStr);
		for(int i = 0; i < jsonArray.length(); i++) {
			//System.out.println("jsonArray: " + jsonArray.getJSONObject(i));
			object = jsonArray.getJSONObject(i);
			strResult = object.getString("results");
			//System.out.println("results: "+string);
		}
		JSONArray jsonArray1 = new JSONArray(strResult);
		for(int i = 0; i < jsonArray1.length(); i++) {
			//System.out.println("jsonArray1: " + jsonArray1.getJSONObject(i));
			object = jsonArray1.getJSONObject(i);
			strResult = object.getString("values");
			//System.out.println("values: "+string);
		}
		
		JSONArray jsonArray2 = new JSONArray("["+strResult+"]");
		for(int i = 0; i < jsonArray2.length(); i++) {
			//System.out.println("jsonArray2: " + jsonArray2.getJSONObject(i));
			object = jsonArray2.getJSONObject(i);
			strResult = object.getString("text");
			//System.out.println("text: "+string);
		}
		return strResult;
	}
	
}

百度AI语音识别部分:

DeCoder类,用来进行语音格式的转换详细信息,查看此文章

import java.io.IOException;

import org.nutz.lang.Encoding;
import org.nutz.lang.Lang;

public class DeCoder {
	 /**
     * 解码为pcm格式
     * @param silk 
     * @param pcm 
     * @return
     */
    public static boolean getPcm(String silk,String pcm){
        boolean flag = true;
        String cmd="cmd.exe /c C:\\silk_v3_decoder.exe "+silk+" "+pcm+" -quiet";
        System.out.println("转码到pcm...");
        try
        {
            StringBuilder msg = Lang.execOutput(cmd, Encoding.CHARSET_GBK);
            System.out.println(msg);
        }
        catch (IOException e)
        {
            e.printStackTrace();
            flag = false;
        }
        return flag;
    }

    /**
     * 转码为MP3格式
     * @param pcm 
     * @param mp3 
     * @return
     */
    public static boolean getMp3(String pcm,String mp3){
        boolean flag = true;
        String command = "cmd.exe /c C:\\ffmpeg.exe -y -f s16le -ar 24000 -ac 1 -i "+pcm+" "+mp3+" ";
        System.out.println("转码到mp3...");
        try {
            StringBuilder sb = Lang.execOutput(command, Encoding.CHARSET_GBK);
            System.out.println(sb);
        } catch (IOException e) {
            e.printStackTrace();
            flag = false;
        }
        return flag;
    }
}

Sample类,发送消息给百度AI,进行语音识别详细信息,查看此官方文档

import org.json.JSONObject;

import com.baidu.aip.speech.AipSpeech;

import net.sf.json.JSONArray;
import net.sf.json.JSONException;

public class Sample {
	 //设置APPID/AK/SK   都填写自己的
    public static final String APP_ID = "app_id";
    public static final String API_KEY = "app_key";
    public static final String SECRET_KEY = "secret_key";
    
    //进行语音格式转换和发送给百度AI进行语音识别
	public static String checkMeg() {
	
	//此路径详见DeCoder类
		String silk = "D:\\test.silk";
    	String pcm = "D:\\test.pcm";
        String mp3 = "D:\\test.mp3";
    	
        DeCoder deCoder = new DeCoder();
        boolean b = deCoder.getPcm(silk, pcm);
        System.out.println(b);
        if(b)
        	deCoder.getMp3(pcm, mp3);
    	
    	String filePath = "D:\\test.pcm";
        String sendPost = sendPost(filePath);
        
        //post返回剪切好的字符串
        return sendPost;
	}
    
    
//发送给百度AI进行语音识别,详见官方文档
	private static String sendPost(String filePath) {
		// 初始化一个AipSpeech
        AipSpeech client = new AipSpeech(APP_ID, API_KEY, SECRET_KEY);

        // 可选:设置网络连接参数
        client.setConnectionTimeoutInMillis(2000);
        client.setSocketTimeoutInMillis(60000);

        // 可选:设置代理服务器地址, http和socket二选一,或者均不设置
//        client.setHttpProxy("proxy_host", proxy_port);  // 设置http代理
//        client.setSocketProxy("proxy_host", proxy_port);  // 设置socket代理

        // 可选:设置log4j日志输出格式,若不设置,则使用默认配置
        // 也可以直接通过jvm启动参数设置此环境变量
//        System.setProperty("aip.log4j.conf", "path/to/your/log4j.properties");

        // 调用接口
        JSONObject res = client.asr(filePath, "pcm", 16000, null);
        String string = res.toString(2);
        
        System.out.println("返回JSON: "+string);
        
        //获取结果
        String resultMeg = getResultMeg("["+string+"]");
//        System.out.println(resultMeg);
        
        //剪切字符串
  		int last = resultMeg.indexOf("\"]");
  		String lastResult = resultMeg.substring(2, last);
//  		System.out.println(lastResult);
        
  		//将剪切好的字符串返回
        return lastResult;
        
	}
	//对百度AI返回的结果进行解析,获取回复字段消息
	public static String getResultMeg(String tulingStr) {
		net.sf.json.JSONObject object = null;
		String strResult = "";
		JSONArray jsonArray = new JSONArray(tulingStr);
		for(int i = 0; i < jsonArray.length(); i++) {
			object = (net.sf.json.JSONObject) jsonArray.getJSONObject(i);
			try {
				strResult = object.getString("result");
			} catch (JSONException e) {
//				e.printStackTrace();
				strResult = "[\""+"太吵了,听不清楚.."+"\"]";
			}
		}
		return strResult;
	}
}


(2)微信小程序实现:
这部分我是直接使用的github的项目,只是做了功能部分的修改,直接下载导入微信开发者工具,修改servlet访问路径即可。下载地址:微信小程序实现提取码:gnzo。导入时需要填入自己的测试码,不然不可以使用。切记哦!!


以上就是整个小项目的实现过程,难点在于图林机器人的跨域问题,还有语音格式的转换,需要注意一下。好啦,以上就是我对这个小项目的一个小的总结,希望可以帮助到你们。

没有更多推荐了,返回首页