2018-03-27 11:06:05 qq_20124743 阅读数 1612
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27752 人正在学习 去看看 秦子恒

前几天接到通知:因微信支付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



2018-04-10 00:15:46 yangshuolll 阅读数 730
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27752 人正在学习 去看看 秦子恒

今天在邮箱中看到这样一句话

尊敬的微信支付商户:

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

微信支付团队
2018年3月14日

所以就立刻检查了下自己的服务器是否部署了DigiCert的根CA证书。(一般服务器上都是部署了类似的根证书的。就像装windows自带IE一样,但是以防万一我看是检查下)

检查的方式如下

(1)微信商户找到的自己的mch_id  这个就是商户号 例如mch_id = 1111111

(2) 生成一个不超过32位的随机字符串 nonce_str, 例如nonce_str = 7UNdMuYryxEtLirA

(3)然后去这个网址网址链接, 在XML源串贴上这串xml。在商户key一栏写你在商户平台上设置的商户key。 其他的默认不变

<xml> 

<mch_id>1111111</mch_id> 

<nonce_str>7UNdMuYryxEtLirA</nonce_str> 

</xml>

(4)这样就获得了sign的值

(5)然后在你的centos控制台中写入这个回车就可以了。

echo '<xml><mch_id>1111111</mch_id><nonce_str>7UNdMuYryxEtLirA</nonce_str><sign>4A1CD6111DADC112CE6AFC391C7C4A0F42C6</sign></xml>'|curl -X POST -H 'Content-type:text/xml' -d @- https://apitest.mch.weixin.qq.com/sandboxnew/pay/getsignkey

(6)如果有根证书,结果如下

  <return_code><![CDATA[SUCCESS]]></return_code>
  <return_msg><![CDATA[ok]]></return_msg>


注意:教程里的参数需要时你商户的参数。我只是做一个示例,你直接替换该替换的内容就好了,就三个参数mch_id, nonce_str, sign。 其中sign是仅仅是有mch_id和nonce_str这两个参数加密得到的(限于此沙箱的测试环境)。





2018-05-23 15:27:17 u010513756 阅读数 599
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27752 人正在学习 去看看 秦子恒

收到了这样的一个通知:微信支付HTTPS服务器证书的根证书将于2018-08-23日到期,微信支付计划于2018-05-29日更换服务器证书。请通知贵司技术开发人员尽快完成相关验证,确保安装新的根证书,以免影响正常交易。详细验证流程可参考指引(http://url.cn/52EYiAE

链接中给了两种方式去判断当前机器是否支持新证书,我这里用到的是第一种——调用微信支付沙箱环境的API接口验证

        //商户id
        String mchID = Constant.MCHID;
        //32位随机字符串
        String nonceStr = RandomStringGenerator.getRandomStringByLength(32);


        //传入验签参数
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("mch_id", mchID);
        map.put("nonce_str", nonceStr);

        //生成sign
        ArrayList<String> list = new ArrayList<String>();
        for(Map.Entry<String,Object> entry:map.entrySet()){
            if(entry.getValue()!=""){
                list.add(entry.getKey() + "=" + entry.getValue() + "&");
            }
        }
        int size = list.size();
        String [] arrayToSort = list.toArray(new String[size]);
        Arrays.sort(arrayToSort, String.CASE_INSENSITIVE_ORDER);
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < size; i ++) {
            sb.append(arrayToSort[i]);
        }
        String result = sb.toString();
        result += "key=" + Constant.MCHID_KEY;  //商户密钥
        Util.log("Sign Before MD5:" + result);
        System.out.println("----------------------------------------------Sign Before MD5:" + result);
        result = MD5.MD5Encode(result).toUpperCase();//生成的sign
        Util.log("Sign Result:" + result);
        System.out.println("-----------------------------------------Sign Result:" + result);


        map.put("sign", result);

        Map<String, String> map2 = new HashMap<>();
        map2.put("mch_id", mchID);
        map2.put("nonce_str", nonceStr);
        map2.put("sign", result);

        //将验签结果变成一个无头的xml字符串
        String xml = AppTool.createXML(map2);

        System.out.println("xml=" + xml);

        result = AppTool.sendPostData("https://apitest.mch.weixin.qq.com/sandboxnew/pay/getsignkey", xml);

        System.out.println("result="+result);

如果最后输出的内容是下图

这里写图片描述

说明当前服务器是支持微信新证书的,附上两个要用到的方法

    /**
     * 创建一个无头的xml
     */
    public static String createXML(Map<String, String> map) {
        Document document = DocumentHelper.createDocument();
        Element element = document.addElement("xml");
        for(String key : map.keySet()) {
            Element appid = element.addElement(key);
            appid.setText(map.get(key));
        }
        String result = document.asXML();
        return result.substring(39, result.length());
    }
    /**
     * @param POST_URL url地址
     * @param content  key=value形式
     * @return 返回结果
     * @throws Exception
     */
    public static String sendPostData(String POST_URL, String content)
            throws Exception {
        HttpURLConnection connection=null;
        DataOutputStream out=null;
        BufferedReader reader=null;
        String line = "";
        String result="";
        try {
            URL postUrl = new URL(POST_URL);
            connection= (HttpURLConnection) postUrl.openConnection();
            connection.setDoOutput(true);
            connection.setDoInput(true);
            connection.setRequestMethod("POST");
            // Post 请求不能使用缓存
            connection.setUseCaches(false);
            connection.setInstanceFollowRedirects(true);
            connection.setRequestProperty("Content-Type",
                    "application/x-www-form-urlencoded");
            connection.connect();

            out = new DataOutputStream(connection.getOutputStream());
            //content = URLEncoder.encode(content, "utf-8");
            // DataOutputStream.writeBytes将字符串中的16位的unicode字符�?8位的字符形式写道流里�?
            out.writeBytes(content);
            out.flush();
            out.close();
            //获取结果
            reader = new BufferedReader(new InputStreamReader(
                    connection.getInputStream(), "utf-8"));// 设置编码
            while ((line = reader.readLine()) != null) {
                result=result+line;
            }       
            return result;
        } catch (Exception e) {
            throw e;
        }finally
        {
            if(out!=null)
            {
                out.close();
                out=null;               
            }
            if(reader!=null)
            {
                reader.close();
                reader=null;                
            }
            connection.disconnect();
        }
    }
2018-04-19 18:32:00 weixin_34029680 阅读数 54
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27752 人正在学习 去看看 秦子恒

收到一封邮件如下:

微信支付服务器证书更换

微信支付计划于2018年5月29日更换服务器证书。请开发人员尽快进行服务器根证书验证,以免影响正常交易。

但是好像跟PHP没有关系,详情见地址:https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=23_4#menu2

安装说明,写了一段代码验证证书:

<?php
function check_wx() {
            $mch_id = '1472935992'; // 商户号
        $key = '14c507c22ed1sdbdffce5877a5322a54'; // 商户支付密钥
        $nonce_str = strtoupper(md5('3123123131')); // 随机字符串
 
        // 开始生成sign
        $str = "mch_id=".$mch_id."&nonce_str=".$nonce_str."&key=".$key;
        $sign = strtoupper(md5( $str ));
 
 
        // 打印字符串和签名
        echo $nonce_str;
        echo "<br />";
        echo $sign;
 
 
        $xml = "<xml>
                  <mch_id>1495281252</mch_id>
                  <nonce_str>4E74A5EC8F10C3E7EECE6D8D574CB861</nonce_str>
                  <sign>BFB9329EC7B027DF83AFB848F08E8077</sign>
                </xml>";
        $url = "https://apitest.mch.weixin.qq.com/sandboxnew/pay/getsignkey";
        /*$a = '{"mch_id":"1495281252","nonce_str":"4E74A5EC8F10C3E7EECE6D8D574CB861","sign":"BFB9329EC7B027DF83AFB848F08E8077"}';*/
        // $result = http_request($url,$xml);
        $result = postXmlCurl($xml,$url);
        var_dump($result);
 
 
 
 
    }
    /**
     *  作用:以post方式提交xml到对应的接口url
     */
    function postXmlCurl($xml,$url,$second=30)
    {      
        //初始化curl       
        $ch = curl_init();
        //设置超时  CURLOP_TIMEOUT
        //curl_setopt($ch, CURLOP_TIMEOUT, $second);
        curl_setopt($ch, CURLOPT_TIMEOUT, $second);
        //这里设置代理,如果有的话
        //curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8');
        //curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
        curl_setopt($ch,CURLOPT_URL, $url);
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
        //设置header
        curl_setopt($ch, CURLOPT_HEADER, FALSE);
        //要求结果为字符串且输出到屏幕上
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        //post提交方式
        curl_setopt($ch, CURLOPT_POST, TRUE);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
        //运行curl
        $data = curl_exec($ch);
        //curl_close($ch);
        //返回结果
        if($data)
        {
            curl_close($ch);
            return $data;
        }
        else
        {
            $error = curl_errno($ch);
            //echo "curl出错,错误码:$error"."<br>";
            //echo "<a href='http://curl.haxx.se/libcurl/c/libcurl-errors.html'>错误原因查询</a></br>";
            curl_close($ch);
            return false;
        }
    }
      check_wx();  
        
?>

返回内容如下:

4E74A5EC8F10C3E7EECE6D8D574CB891<br />AD622820D6A0DAFD2759191A08EC70C9string(185) "<xml>
  <return_code><![CDATA[SUCCESS]]></return_code>
  <return_msg><![CDATA[ok]]></return_msg>
  <sandbox_signkey><![CDATA[dfddf9f3374aa77dfb49260749945856]]></sandbox_signkey>
</xml>"

说明没有问题,完毕。

2018-12-14 13:13:00 weixin_34380781 阅读数 96
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27752 人正在学习 去看看 秦子恒
原文:【记】微信支付服务器证书更换通知的验证流程

【重要】微信支付服务器证书更换通知,请开发人员验证以免影响交易

尊敬的微信支付商户&服务商:

       因微信支付HTTPS服务器证书的根CA证书将于2018年8月23日到期失效,微信支付计划于2018年5月29日, 更换服务器证书。

       新的服务器证书由权威机构(DigiCert) 签发, 如果你的服务器上没有部署DigiCert的根CA证书,将导致你的下单、退款等功能无法正常使用。请开发人员务必尽快完成证书验证及安装,详细流程可参考《微信支付HTTPS服务器证书验证指引》

 

调用微信支付沙箱环境的API接口验证时,服务器一直返回  远程服务器返回错误: (400) 错误的请求。

 

解决办法:

Post请求时需要带上商户证书!

商户证书下载:微信商户平台(pay.weixin.qq.com)-->账户中心-->账户设置-->API安全-->证书下载

 

 

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