微信开发https

2018-01-02 14:15:00 keke24 阅读数 3969

微信开发者文档中指出,第三方在访问微信接口时大多数采用的是https的访问模式,其中有这三种特点:
1.https请求
2.get或post请求方式
3.支持有参数和没有参数提交
百度百科中指出HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个系统的最初研发由网景公司(Netscape)进行,并内置于其浏览器Netscape Navigator中,提供了身份验证与加密通讯方法。现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。

 JSSE简介

  Java安全套接扩展 (Java Secure Socket Extension, JSSE)是实现Internet安全通信的一系列包的集合。它是一个SSL和TLS的纯Java实现,可以透明地提供数据加密、服务器认证、信息完整性 等功能,可以使我们像使用普通的套接字一样使用JSSE建立的安全套接字。JSSE是一个开放的标准,不只是Sun公司才能实现一个JSSE,事实上其他 公司有自己实现的JSSE。

  在深入了解JSSE之前,需要了解一个有关Java安全的概念:客户端的TrustStore文件。客户端的TrustStore文件中保存着被客户端所信任的服务器的证书信息。客户端在进行SSL连接时,JSSE将根据这个文件中的证书决定是否信任服务器端的证书。

  JSSE中,有一个信任管理器类负责决定是否信任远端的证书,这个类有如下的处理规则:

  ⑴ 果系统属性javax.net.sll.trustStore指定了TrustStore文件,那么信任管理器就去jre安装路径下的lib/security/目录中寻找并使用这个文件来检查证书。

  ⑵ 果该系统属性没有指定TrustStore文件,它就会去jre安装路径下寻找默认的TrustStore文件,这个文件的相对路径为:lib/security/jssecacerts。

  ⑶ 如果 jssecacerts不存在,但是cacerts存在(它随J2SDK一起发行,含有数量有限的可信任的基本证书),那么这个默认的TrustStore文件就是cacerts。

  直接使用类HttpsURLConnection访问Web页面

  Java提供了一种非常简洁的方法来访问HTTPS网页,即使用类HttpsURLConnection、URL等。这几个类为支持HTTPS对JSSE相关类做了进一步的封装,例子如下所示:
 

URL reqURL = new URL("https://www.sun.com" ); //创建URL对象
HttpsURLConnection httpsConn = (HttpsURLConnection)reqURL.openConnection();

/*下面这段代码实现向Web页面发送数据,实现与网页的交互访问
httpsConn.setDoOutput(true);
OutputStreamWriter out = new OutputStreamWriter(huc.getOutputStream(), "8859_1");
out.write( "……" );
out.flush();
out.close();
*/

//取得该连接的输入流,以读取响应内容
InputStreamReader insr = new InputStreamReader(httpsConn.getInputStream();

//读取服务器的响应内容并显示
int respInt = insr.read();
while( respInt != -1){
 System.out.print((char)respInt);
 respInt = insr.read();
}

所以想要使用https请求访问微信的接口,有两种可以实现的方式:

1.将证书导入到TrustStore文件中
Java提供了命令行工具keytool用于创建证书或者把证书从其它文件中导入到Java自己的TrustStore文件中。把证书从其它文件导入到TrustStore文件中的命令行格式为:

keytool -import -file src_cer_file –keystore dest_cer_store

其中,src_cer_file为存有证书信息的源文件名,dest_cer_store为目标TrustStore文件。
在使用keytool之前,首先要取得源证书文件,这个源文件可使用IE浏览器获得,IE浏览器会把访问过的HTTPS站点的证书保存到本地。从IE 浏览器导出证书的方法是打开“Internet 选项”,选择“内容”选项卡,点击“证书…”按钮,在打开的证书对话框中,选中一个证书,然后点击“导出…”按钮,按提示一步步将该证书保存到一文件中。 最后就可利用keytool把该证书导入到Java的TrustStore文件中。为了能使Java程序找到该文件,应该把这个文件复制到jre安装路径 下的lib/security/目录中。

这样,只需在程序中设置系统属性javax.net.sll.trustStore指向文件dest_cer_store,就能使JSSE信任该证书,从而使程序可以访问使用未经验证的证书的HTTPS站点。
使用这种方法,编程非常简单,但需要手工导出服务器的证书。当服务器证书经常变化时,就需要经常进行手工导出证书的操作。下面介绍的实现X509证书信任管理器类的方法将避免手工导出证书的问题。

2.X509证书信任管理器类的实现及应用
在JSSE中,证书信任管理器类就是实现了接口X509TrustManager的类。我们可以自己实现该接口,让它信任我们指定的证书。
  接口X509TrustManager有下述三个公有的方法需要我们实现:

  ⑴ void checkClientTrusted(X509Certificate[] chain, String authType) 
throws CertificateException

  该方法检查客户端的证书,若不信任该证书则抛出异常。由于我们不需要对客户端进行认证,因此我们只需要执行默认的信任管理器的这个方法。JSSE中,默认的信任管理器类为TrustManager。

  ⑵ void checkServerTrusted(X509Certificate[] chain, String authType) 
throws CertificateException 

  该方法检查服务器的证书,若不信任该证书同样抛出异常。通过自己实现该方法,可以使之信任我们指定的任何证书。在实现该方法时,也可以简单的不做任何处理,即一个空的函数体,由于不会抛出异常,它就会信任任何证书。

  ⑶ X509Certificate[] getAcceptedIssuers() 

  返回受信任的X509证书数组。
java完整代码:

/*
 *证书信任管理器(用于实现https) 
 */
public class MyX509TrustManager implements X509TrustManager{

    @Override
    public void checkClientTrusted(X509Certificate[] arg0, String arg1)
            throws CertificateException {
        // TODO Auto-generated method stub

    }

    @Override
    public void checkServerTrusted(X509Certificate[] arg0, String arg1)
            throws CertificateException {
        // TODO Auto-generated method stub

    }

    @Override
    public X509Certificate[] getAcceptedIssuers() {
        // TODO Auto-generated method stub
        return null;
    }

}

  自己实现了信任管理器类,如何使用呢?类HttpsURLConnection似乎并没有提供方法设置信任管理器。其 实,HttpsURLConnection通过SSLSocket来建立与HTTPS的安全连接,SSLSocket对象是由 SSLSocketFactory生成的。HttpsURLConnection提供了方法 setSSLSocketFactory(SSLSocketFactory)设置它使用的SSLSocketFactory对象。 SSLSocketFactory通过SSLContext对象来获得,在初始化SSLContext对象时,可指定信任管理器对象。下面用一个图简单表 示这几个JSSE类的关系:这里写图片描述

图1 部分JSSE类的关系图
  假设自己实现的X509TrustManager类的类名为:MyX509TrustManager,下面的代码片断说明了如何使用MyX509TrustManager:

public class HttpsUtil {

    public static void https(String requestUrl,String requestMethod,String submitData)
    {
        try {
            //设置https访问模式,采用SSL加密
            TrustManager[] tm={new MyX509TrustManager()};
            // 创建SSLContext对象,并使用我们指定的信任管理器初始化
            SSLContext sslContext=SSLContext.getInstance("SSL","SunJSSE");
            sslContext.init(null, tm, new java.security.SecureRandom());
            //从sslContext获取SSLSocketFactory
            SSLSocketFactory ssf=sslContext.getSocketFactory();
            URL url=new URL(requestUrl);
            HttpsURLConnection httpsURLCon=(HttpsURLConnection) url.openConnection();
            httpsURLCon.setSSLSocketFactory(ssf);
            httpsURLCon.setDoInput(true);
            httpsURLCon.setDoOutput(true);
            httpsURLCon.setUseCaches(false);
            httpsURLCon.setRequestMethod(requestMethod);//设置请求方式get;post
            if ("GET".equalsIgnoreCase(requestMethod)) {
                httpsURLCon.connect();
            }
            //当需要有数据提交给微信接口时
            if (null!=submitData) {
                OutputStream outputStream=httpsURLCon.getOutputStream();
                outputStream.write(submitData.getBytes("UTF-8"));
                outputStream.close();
            }
    }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

于此,我们就封装了一个https请求的方法,接下来我们可以通过这个方法来调用https访问微信的接口来实现诸如修改菜单,上传图片等等功能。

2018-05-05 17:49:12 sinat_36553913 阅读数 3501

说明

公司需要开发微信服务号,要求做有关技术验证,学习了微信公众号的开发,在这里记录总结下。

正文

      学习微信公众号的开发,必须先阅读微信开发文档,通过阅读文档,了解有关微信公众开发的步骤及相关限制,了解其工作原理等。

微信开发之入门指引

      通过阅读入门指引,发现在正式开发之前必须要具备几个条件:1.申请微信公众号 2. 后台服务器 3.开发者配置

申请测试公众号

在微信官网申请公众号时,发现目前公众号只有两类帐号:服务号和订阅号,个人只能申请订阅号。原来的企业号变为企业微信,增加了微信小程序。申请地址为:https://mp.weixin.qq.com/
这里写图片描述

通过阅读微信文档的公众号接口权限说明,发现未经认证的订阅号接口权限十分有限,无法完成接下来的技术验证。
这里写图片描述
这里使用微信提供的在线测试平台,申请一个接口测试号完成有关技术验证。地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
这里写图片描述

使用自己的微信号通过扫码即可申请一个测试号
这里写图片描述
微信会自动为测试号分配appID和appsecret,这两个参数是开发的关键。
测试号申请到这里就结束了,接下来配置服务器。

配置本地服务器

阅读微信开发文档时发现,服务器必须外网可以访问且端口为80。要么需要购买云服务器,但这对我们开发调试有很大的不便,这里我使用了内网穿透工具实现外网访问,将本地的tomcat作为后台的应用服务器。
工具为NATAPP,使用此工具可以自动将它产生的域名映射为本地的ip地址+端口。地址:https://natapp.cn/
这里写图片描述

在下方的客户端下载中选择适合自己电脑的版本
这里写图片描述

下载成功后需要注册登录申请免费隧道,每个用户可以拥有两条不同协议的隧道,免费隧道域名随机分配且会强制更换,这点在开发时需要注意,需要在微信配置中随时更换URL。
这里写图片描述

在申请时注意隧道协议为web,且本地端口为80
这里写图片描述
申请好会为隧道分配一个authtoken,这个token时让NATAPP可以运行起来的关键,接下来在运行前必须配置文件,关于配置文件的下载地址:https://natapp.cn/article/config_ini ,更多教程参考:https://natapp.cn/article/natapp_newbie
配置文件必须与之前解压的natapp.exe在同一级目录,然后将得到的authtoken填入保存。
这里写图片描述

运行结果为:
这里写图片描述
这里可以看到随机分配的域名指向了本地的80端口。这里的域名就是测试号配置URL需要填写的参数。

关于本地服务器的搭建到这里就结束了,接下来在之前申请的测试号中进行配置。

配置测试号

在配置之前必须搭建一个web项目,因为填写配置时微信服务器会向后台进行验证,后台给出正确的响应才会配置成功。这里我使用了SpringBoot构建web项目,关于SpringBoot如何构建web项目,可以在网上查阅相关资料,对于SpringBoot的学习推荐翟永超的博客程序猿DD。关于如果将SpringBoot项目部署到本地Tomcat中请参考另一篇博文《将Spring Boot项目部署到本地Tomcat中》

这里写图片描述
URL即为NATAPP运行时得到的域名,Token随意填写,程序中需要使用。

校验代码:

@RequestMapping(value="hello", method = RequestMethod.GET)
    public void hello(HttpServletRequest request,
                        HttpServletResponse response){
        System.out.println("success");
        String signature = request.getParameter("signature");
        String timestamp = request.getParameter("timestamp");
        String nonce = request.getParameter("nonce");
        String echostr = request.getParameter("echostr");

        PrintWriter out = null;
        try {
            out = response.getWriter();
            if(CheckUtil.checkSignature(signature,timestamp, nonce)){
                out.write(echostr);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            out.close();
        }

    }

在校验类CheckUtil中对微信服务器传来的参数进行校验

import java.security.MessageDigest;
import java.util.Arrays;

public class CheckUtil {
    public static final String tooken = "testdemo";
    public static boolean checkSignature(String singnature, String timestamp, String nonce){
        String[] arr = {tooken, timestamp,nonce};
        Arrays.sort(arr);
        StringBuilder sb = new StringBuilder();
        for(String s : arr){
            sb.append(s);
        }
        String temp = getSha1(sb.toString());
        return temp.equals(singnature);
    }

    private static String getSha1(String str){
        if(str==null||str.length()==0){
            return null;
        }

        char hexDigits[] = {'0','1','2','3','4','5','6','7','8','9',
                'a','b','c','d','e','f'};

        try {
            MessageDigest mdTemp = MessageDigest.getInstance("SHA1");

            mdTemp.update(str.getBytes("UTF-8"));

            byte[] md = mdTemp.digest();
            int j = md.length;
            char buf[] = new char[j*2];
            int k = 0;

            for (int i = 0; i < j; i++) {
                byte byte0 = md[i];
                buf[k++] = hexDigits[byte0 >>> 4 & 0xf];
                buf[k++] = hexDigits[byte0 & 0xf];
            }

            return new String(buf);

        } catch (Exception e) {
            return null;

        }
    }
}

能正常响应时,就会出现配置成功,接下来就可以进行验证开发了。

2015-12-15 17:20:04 u013142781 阅读数 14160

时间葱葱,小宝鸽入职也有半年了,刚入的时候刚好有负责开发一个微信企业号的新项目。从项目的一无所有到第一版上线,再一步步完善升级。期间学到了许多东西。对微信开发也是有了一定的认识。在此,小宝鸽再次无私地分享给大家啦。

其实微信开发跟web开发没有多大的区别,只是经过了微信,然后再由浏览器打开。因为经过微信,因此你的web会附加一些微信平台所提供的一些功能,如获取用户地理位置、获取微信用户头像、拍照上传、发送微信消息等等,通过微信接口即可调用。要将web项目挂靠在微信公众平台上是需要一个帐号的。微信公众平号分为服务号、订阅号、企业号。这三种帐号有一些小区别,但是开发流程都是差不多的,只是开放的功能上有些区别,知道其中一种开发,其他的也差不多。关于具体区别先不作过多介绍,后面的文章会讲到。接下来我们以企业号为例带大家进入微信开发之旅。

接下来将从下面几个角度带大家了解微信开发:

(1)申请企业号体验号
(2)企业号的一些配置
(3)微信JS接口调用

好了现在马上开始:

一、申请企业号体验号

1.1、首先来到微信企业号的网址 https://qy.weixin.qq.com/

这里写图片描述

1.2、可以看到“开发者中心”字眼,点击进入相应页面

这里写图片描述

1.3、进入后可以看到“欢迎你,开发者”的公告,右侧有个“申请体验号”,点击进入相应页面。

这里写图片描述

1.4、进入“申请体验号”后,可以看到注册流程,按照注册流程填写相应资料并申请,验证邮箱绑定微信号后体验号就申请成功啦。

这里写图片描述

1.5、申请成功之后,回到https://qy.weixin.qq.com/,用微信扫一扫扫描登录下方的二维码,输入对应密码即可登录成功,来到你的微信企业号首页啦。

这里写图片描述

二、企业号的一些配置

2.1、添加子部门,如下图,将鼠标放到“企业号体验43560625”就会出现小下标,然后点击添加子部门,填写好信息保存,然后刷新页面即可。

这里写图片描述
这里写图片描述

2.2、添加成员,点击通讯录,然后如下图进行操作,即可添加成员。部门选择刚刚添加的部门

这里写图片描述

2.3、然成员关注该企业号,如果添加成员的时候有输入邮箱,可以在通讯录的成员管理那里给成员发送关注邀请,邀请会将企业号二维码发送到对应成员邮箱。另外一种方法直接点击“设置”即可看到体验号二维码。让成员扫这个二维码关注也是可以的(需要注意的是,体验号只能最多关注10个成员哦)。另外下图中的CorpID (wx7099477f2de8aded)非常重要的,先记录起来,下面接口微信JS调用的时候会用到。

这里写图片描述

2.4、添加管理组,点击“设置”–>”权限管理”,就会跳转到下图页面,然后“新建管理组”,选择管理员的时候,如果提示该成员已在其他管理组,那么估计需要添加成员了。小宝鸽添加了一个管理组“测试”,添加成功后如下图。其中Secret也是非常重要的东西,之后JS接口调用获取签名需要用到。

这里写图片描述

2.5、应用管理。猿友们可以看到左侧菜单中有个”应用中心”。点击应用中心将来到下图页面。”企业小助手”就是本企业号默认存在的一个应用。猿友们可以自行创建更多的应用。

这里写图片描述

点击”企业小助手”将会来到下面的界面,默认是回调模式,我们需要设置成普通模式。

这里写图片描述

点击”普通模式”,启用模式,然后启用”自定义菜单”。

这里写图片描述

自定义菜单启用完成之后,点击自定义菜单中的设置,将会跳转到如下页面:

这里写图片描述

添加菜单”测试”,然后设置”微信信息”,内容为”测试啦啦啦”,保存–>发布,然后右边有个预览,点击菜单”测试”,就会自动回复消息,如下图:

这里写图片描述

菜单响应除了发送微信消息也可以是跳转到某个链接,因为跳转链接是需要配置可信域名的,因此先介绍如何配置可信域名
应用管理还有一个地方需要设置的,那就可信域名,如下图,回到”企业小助手”应用的详情页面,添加可信域名,可信域名是有一些要求的(1. 设置的应用域名须通过ICP备案的验证,2. 请使用二级或二级以上域名),这里小宝鸽网上找了一个”yo.bbdfun.com”,猿友们也可以使用这个

这里写图片描述

配置了可信域名之后呢,猿友们可以配置跳转到链接的菜单啦,注意配置的url必须是已可信域名作为域名哈,例如:

这里写图片描述

三、微信JS接口调用

3.1、微信提供了一系列的JS接口,使得公众号企开发十分快捷高效,微信JS-SDK接口:
http://qydev.weixin.qq.com/wiki/index.php?title=%E5%BE%AE%E4%BF%A1JS-SDK%E6%8E%A5%E5%8F%A3
各位猿友们可粗略看一下上面文档,便可知道大概提供的一些功能。

3.2、各位猿友们粗略看完”微信JS-SDK接口”,应该有看到下图的说明吧,接口的使用是需要注入权限验证配置的,现在我们上面的体验号等等的一系列操作就派上用场啦。

这里写图片描述

3.3、接下来将会一点点向大家介绍怎么调用微信接口啦

微信接口文档之后的猿友们应该都知道微信接口的调用步骤如下:

这里写图片描述

最重要的还是步骤二:权限验证配置。里面有几个参数,小宝鸽将会为猿友们一一介绍:
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来
appId: ”, // 必填,企业号的唯一标识,此处填写企业号corpid
timestamp: , // 必填,生成签名的时间戳
nonceStr: ”, // 必填,生成签名的随机串
signature: ”,// 必填,签名,见附录1
jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2

debug、appId和jsApiList相信各位猿友们应该都知道大概是什么东西。那么现在给各位猿友们重点介绍:timestamp、nonceStr、signature。
其实timestamp、nonceStr是用来生成signature的。
js生成时间戳方法:timestamp = Date.parse(new Date()); //1414587457
另外,nonceStr也是一串随机串,我们也用时间戳就好了nonceStr=Date.parse(new Date()); //1414587457

剩下的就是最关键的signature生成方法,这里需要引入access_token概念
生成signature签名第一步获得access_token:
浏览器输入:https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=wx5f24fa0db1819ea2&corpsecret=uQtWzF0bQtl2KRHX0amekjpq8L0aO96LSpSNfctOBLRbuYPO4DUBhMn0_v2jHS-9
即可得到access_token:YoxXjnJS57r8gk5Nf-Ki_mSvn98fILxv56EE7NFWE3qQNOH3OaW4iDWwLc05g1mdbuNhipK8fgy-q-pA93DqFw(其有效期为7200秒,即两个小时)

这里写图片描述

生成signature签名第二步通过access_token获得ticket:
浏览器输入:https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=YoxXjnJS57r8gk5Nf-Ki_mSvn98fILxv56EE7NFWE3qQNOH3OaW4iDWwLc05g1mdbuNhipK8fgy-q-pA93DqFw
即可得到ticket:”sM4AOVdWfPE4DxkXGEs8VLMMSNOZxIv5IhnWCyv5sA4UgJuWuMQdfMCeyC5kSL_c7OIMGeETC2y9PXfLbFIFNw(其有效期也是7200秒,即两个小时)

这里写图片描述

生成signature签名第三步通过ticket以及下面参数拼成字符串:
noncestr=1414587457
jsapi_ticket(即上面的ticket)=sM4AOVdWfPE4DxkXGEs8VLMMSNOZxIv5IhnWCyv5sA5kumyWTQ2VcKEcphBAW62J_HUgmaiKEQ3qhwj5Vlqq7g
timestamp=1414587457
url=http://mp.weixin.qq.com

通过上面的参数拼成(注意参数顺序必须一样):jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VLMMSNOZxIv5IhnWCyv5sA5kumyW
TQ2VcKEcphBAW62J_HUgmaiKEQ3qhwj5Vlqq7g
&noncestr=1414587457&timestamp=1414587457&url=http://mp.weixin.qq.com

最后利用上面的字符串进行sha1加密,有在线的校验工具http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign。但是真正开发的时候肯定是需要写代码的,下面附上sha1加密的java算法:`

jdk也有提供这个java.security这个包,里面封装好了sha1加密算法。使用方法可参考博主的另外一篇博客AES加密解密 SHA1、SHA加密 MD5加密

注意真正获取access_token、ticket的时候是需要通过代码实现的,上面在浏览器输入对应地址获取只是为了理顺流程。下面是通过java代码获取。

3.4、java代码获取签名

关于使用java代码获取签名的详细过程请参考博主的另外一篇文章 微信开发之使用java获取签名signature(贴源码,附工程)

该文章有详细的代码,而且附工程下载。

获取到了签名之后就可以调用微信js接口了,例子后面的文章将会讲到。

2018-03-27 11:06:05 qq_20124743 阅读数 1896

前几天接到通知:因微信支付HTTPS服务器证书的根CA证书将于2018年8月23日到期失效,微信支付计划于2018年5月29日更换服务器证书。新的服务器证书由权威机构(DigiCert) 签发, 如果你的服务器上没有部署DigiCert的根CA证书,将导致你的下单、退款等功能无法正常使用。请开发人员务必尽快完成证书验证及安装,详细流程可查看商户平台公告。

处理如下:

1、在网上查了一些资料,分析得知一般都系统都是不需要修改什么的、因为一般linux环境内置了该证书什,但是毕竟涉及到支付环节需要谨慎,通过查看微信官网(https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=23_4)找到了一些官方的解决方案,分为两种

方式一:调用微信支付沙箱环境的API接口验证

方式二:绑定HOST,请求已部署新证书的微信支付API服务器

在这里我采用的是第一种方式、调用微信支付沙箱环境的API接口验证,在代码中生成微信要求的请求参数拼装成xml,在这里注意只能传递要求的三个参数(mch_idnonce_strsign),多了会报错。当返回结果return_code为“SUCCESS”,说明当前客服端已支持DigCert证书,反之则需要根据安装证书部分的指引,升级证书。

具体的测试如下:

输出参数为=======================

<xml><mch_id>自己的商户号</mch_id><nonce_str>随机字符串</nonce_str><sign>签名</sign></xml>

返回参数为=======================
<xml>
  <return_code><![CDATA[SUCCESS]]></return_code>
  <return_msg><![CDATA[ok]]></return_msg>
  <sandbox_signkey><![CDATA[返回签名]]></sandbox_signkey>

</xml>

以上参数可以再系统中拼装出来,去除掉多余的参数即可。

然后再服务器上通过curl命令调用微信沙箱域名

echo '<xml><mch_id>自己的商户号</mch_id><nonce_str>随机字符串</nonce_str><sign>签名</sign></xml>'|curl -X POST -H 'Content-type:text/xml' -d @- https://apitest.mch.weixin.qq.com/sandboxnew/pay/getsignkey

返回结果为SUCCESS则为成功,如下图所示。如果没有成功,可以根据微信官网说明的步骤去升级安装证书。

顺带复习了一下curl 参数的用法

-H/--header <line>自定义头信息传递给服务器
-X/--request [GET|POST|PUT|DELETE|…]  使用指定的http method發出 http request
-H/--header                         设定request里的header
-i/--include                          展示response的header
-d/--data                             设定 http parameters
-v/--verbose                         输出比较多的信息
-u/--user                             使用者账号、密码

-b/--cookie                           cookie 

以上仅为个人理解,转载请注明出处 https://blog.csdn.net/qq_20124743/article/details/79709433



2017-05-27 14:01:39 weixin_38893715 阅读数 12062

微信官方规定小程序的允许请求的地址都是https开头,所以如果你想搞微信小程序开发,那么服务的地址都必须以https协议的方式提供,也就是说http是不能用的。而且每个月仅能做出5次修改,所以且行且珍惜吧!



在瞎jb折腾了三天后,https安全协议的问题终于解决了。其实你也不必担心,因为需要修改的地方也就两三处。只要你跟着我的思路走,问题肯定是可以解决的。我的环境如下:

-阿里云CES 

-Windows Server2008

-Apache2.4(包含了ssl模块,推荐下载Appserv安装包,Apache,Mysql和PHP一起打包配套好了,很方便)


一. 证书申请

我使用的是阿里云的免费证书,在CA证书功能项下点击申请就行,阿里云官方会给你生成所有你想要的配置文件,并在域名解析中插入一条非常必要的TXT记录。然后你把这个证书包下载后,放置到Apache下新建的cert目录,就可以进入到后续的步骤了。


这个步骤相对来说比较简单,需要注意的地方也不多,按照阿里云官方的提示来,就能够操作成功了。值得注意的是你在申请证书过程中,证书是免费的,你不用付费,但是需要下单,下单完成后需要完善你的域名信息,然后提交审核。审核完成后,官方自动给你发放证书,顺利的话一个小时就能搞定。


好多同学申请证书时,下单后不管了,等着他给你发,可域名信息没有填呀,官方也不知道你给那个域名申请证书,所以完善域名信息这个步骤不要忘了。


二. Apache配置

— 修改httpd.conf文件

申请到证书后,下载Apache对应的文件,解压后放置到Apache根目录下新建的cert目录中,如果没有那么就新建一个cert目录。


打开Apache的配置文件httpd.conf,在这个文件中保证这两条语句如下两句话没有被注释,并能够在对应的文件下找到相应的文件。如果找不到相应的文件,那么说明Apache的安装是有问题的,需要下载其他可用的版本。

必须保证以下这两个配置可用,前面没有被“#”号注释:

LoadModule ssl_module modules/mod_ssl.so

Include conf/extra/httpd-ssl.conf

 

第一个配置的意思是加载mod_ssl.so文件,所以应该检查下Apache目录下的modules文件夹中是否存在mod_ssl.so文件;第二句话的意思是导入Apache根目录下conf/extra/文件夹下的httpd-ssl.conf配置文件,也就是下面我们将要编辑的文件。


以上这两句话非常重要,导入的文件一定是mod_ssl.so和httpd-ssl.conf,网上的教程说的是其他的文件,是不能成功的。


— 修改conf/extra/文件夹下的httpd-ssl.conf文件

下面修改conf/extra/文件夹下的httpd-ssl.conf配置文件,找到Apache根目录下conf/extra/文件夹里的httpd-ssl.conf文件。


添加如下配置:

# 添加 SSL 协议支持协议,去掉不安全的协议
SSLProtocol TLSv1 TLSv1.1 TLSv1.2
# 修改加密套件如下
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4
# 证书公钥配置
SSLCertificateFile cert/public.pem
# 证书私钥配置
SSLCertificateKeyFile cert/214063864580972.key
# 证书链配置,如果该属性开头有 '#'字符,请删除掉
SSLCertificateChainFile cert/chain.pem


这里有几个需要注意的地方:

1.配置的内容不能重复。比如httpd-ssl.conf如果包含了原有的SSLCertificateFile节点,那么把需要把原有的节点注销了,新加入的节点才会有效。


所以在加入之前你应该查找一下原来的文件中是否已经有了必要的配置,如果有了那么把原来的节点内容注销了,然后加入新的配置。


2. 所有的内容都是针对<VirtualHost _default_:443>这个标签中的内容进行修改。如果你修改的是其他的内容,或者是直接把阿里云提供的配置信息复制粘贴到httpd-ssl.conf文件的底部,那么是不会成功的。


3. 修改域名和https指向的根目录。网上很多的文章几乎没有提到过这条内容,这也是很多同学配置没有成功的根本原因。需修改<VirtualHost _default_:443>标签下的DocumentRoot和ServerName这两项内容。



DocumentRoot,顾名思义就是https协议指向的根节点,就好像http默认是指向www目录一样。这个配置你可以自定义,也可以使用默认的htdocs文件夹,默认情况下是没有这个目录的,新建一个然后拷贝phpinfo.php文件到这个文件夹下。


ServerName就是你在申请证书时填写的域名,注意要保留https默认的端口号443。


这是我的httpd-ssl.conf结尾部分的内容,注意除了SSLProtocolSSLCertificateChainFile配置之外的内容都被注销了,因为其他的配置我改的是原来的内容,所以从阿里云拷贝过来的相同的内容就注释掉了。



最后重启Apache,新的设置就会启用了。

上个最后配置成功后,请求的效果吧!