php版微信支付api.mch.weixin.qq.com域名解析慢原因与解决方法


Posted in PHP onOctober 12, 2016

本文实例讲述了php版微信支付api.mch.weixin.qq.com域名解析慢原因与解决方法。分享给大家供大家参考,具体如下:

微信支付api.mch.weixin.qq.com域名解析慢了,导致付款时非常的慢,那么要如何来解决微信支付慢的问题呢,这里就来一起分析一下。

有朋友在阿里云主机实现微信支付逻辑时,发现api.mch.weixin.qq.com的解析实在是太慢了。

因此出现了手动修改/etc/hosts的情况,当然了,哪天微信支付要是换个机房肯定要挂。

我们的机房也有相似的同题,专门记录一下。

代码里用curl来请求微信,经常超时,这时使用wget试验:

[root@01 tmp]# wget api.mch.weixin.qq.com
--2016-06-18 14:51:03-- http://api.mch.weixin.qq.com/
Resolving api.mch.weixin.qq.com...

域名解析很久不出来

测试确认是ipv6问题

给wget加上-4,强制使用ipv4,如果很快,那基本上确定是ipv6惹的祸了。

[root@01 tmp]# wget -4 api.mch.weixin.qq.com
--2016-06-18 17:03:52-- http://api.mch.weixin.qq.com/
Resolving api.mch.weixin.qq.com... 123.151.71.149, 123.151.79.109
Connecting to api.mch.weixin.qq.com|123.151.71.149|:80... connected.

代码分析

专门写个代码来测试ipv6的解析,用到系统函数getaddrinfo:

#include <stdio.h>
#include <string.h>
#include <netdb.h>
#include <iostream>
#include <sys/types.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
using namespace std;
int main() {
  struct addrinfo hints,*answer,*curr,*p;
  int error;
  memset(&hints, 0, sizeof hints);
  hints.ai_family = AF_INET6;//AF_UNSPEC; // use AF_INET6 to force IPv6
  hints.ai_socktype = SOCK_STREAM;//SOCK_DGRAM; // SOCK_STREAM
  if ((error = getaddrinfo("api.mch.weixin.qq.com", NULL, &hints, &answer)) != 0) {
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(error));
    return 1;
  } else cout <<"Success with a URL\n";
  char ipstr[16];
  for (curr = answer; curr != NULL; curr = curr->ai_next) {
    inet_ntop(AF_INET,&(((struct sockaddr_in *)(curr->ai_addr))->sin_addr),ipstr, 16);
    printf("%s\n", ipstr);
  }
  freeaddrinfo(answer);
  return 0;
}

包含头文件

netdb.h

函数原型:

int getaddrinfo( const char hostname, const char service, const struct addrinfo *hints, struct addrinfo **result );

参数说明:

hints:可以是一个空指针,也可以是一个指向某个addrinfo结构体的指针,调用者在这个结构中填入关于期望返回的信息类型的暗示。举例来说:如果指定的服务既支持TCP也支持UDP,那么调用者可以把hints结构中的ai_socktype成员设置成SOCK_DGRAM使得返回的仅仅是适用于数据报套接口的信息。而是否ipv6则由ai_family决定。
result:本函数通过result指针参数返回一个指向addrinfo结构体链表的指针。

返回值:0——成功,非0——出错

测试结果:

ai_family为ipv6时,只会寻找ipv6的解析结果,一般域名也没设置。ai_family为AF_UNSPEC时,会先ipv6再ipv4的,而api.mch.weixin.qq.com这个域名的ipv6解析出奇的慢(qq.com却不慢,原因见后)。

解决办法:

如果是curl,c可以强制指定ipv4,使用curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);

其他语言的也参考此法。

深层原因分析

nslookup -query=AAAA api.mch.weixin.qq.com -debug 是找不到解析的(指定的AAAA就是ipv6),然后会发现一个SOA声明和他的上级weixin.qq.com有一个ipv6的CNAME,到了minorshort.weixin.qq.com,而这域名又是没有ipv6的解析的。

目测ipv6找解析时是在这个SOA和CNAME的地方打圈了,微信的同学们是不是考虑让大伙好过一点,把这些个域名的ipv6设置去掉。

dig @ns-tel1.qq.com weixin.qq.com AAAA
weixin.qq.com.    43200  IN  SOA ns-tel1.qq.com. webmaster.qq.com. 1293502040 300 600 86400 300

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
配置最新的PHP加MYSQL服务器
Oct 09 PHP
在PHP中读取和写入WORD文档的代码
Apr 09 PHP
PHP教程之PHP中shell脚本的使用方法分享
Feb 23 PHP
PHP实现把MySQL数据库导出为.sql文件实例(仿PHPMyadmin导出功能)
May 10 PHP
Yii2实现ajax上传图片插件用法
Apr 28 PHP
PHP实现简易blog的制作
Oct 24 PHP
yii2项目实战之restful api授权验证详解
May 20 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
Aug 28 PHP
php利用ob_start()清除输出和选择性输出的方法
Jan 18 PHP
PHPUnit测试私有属性和方法功能示例
Jun 12 PHP
PHP实现的日历功能示例
Sep 01 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式一图文详解
Apr 09 PHP
如何使用php等比例缩放图片
Oct 12 #PHP
php与python实现的线程池多线程爬虫功能示例
Oct 12 #PHP
php实现的SSO单点登录系统接入功能示例分析
Oct 12 #PHP
php用户密码加密算法分析【Discuz加密算法】
Oct 12 #PHP
基于php实现的php代码加密解密类完整实例
Oct 12 #PHP
php fseek函数读取大文件两种方法
Oct 12 #PHP
PHP从二维数组得到N层分类树的实现代码
Oct 11 #PHP
You might like
php simplexmlElement操作xml的命名空间实现代码
2011/01/04 PHP
文件上传之SWFUpload插件(代码)
2015/07/30 PHP
详解PHP对数组的定义以及数组的创建方法
2015/11/27 PHP
php上传图片生成缩略图(GD库)
2016/01/06 PHP
php车辆违章查询数据示例
2016/10/14 PHP
在PHP 7下安装Swoole与Yar,Yaf的方法教程
2017/06/02 PHP
JQuery 构建客户/服务分离的链接模型中Table中的排序分析
2010/01/22 Javascript
jquery选择器(常用选择器说明)
2010/09/28 Javascript
JavaScript 程序编码规范
2010/11/23 Javascript
JavaScript XML和string相互转化实现代码
2011/07/04 Javascript
jquery学习笔记 用jquery实现无刷新登录
2011/08/08 Javascript
jquery之超简单的div显示和隐藏特效demo(分享)
2013/07/09 Javascript
jQuery实现购物车表单自动结算效果实例
2015/08/10 Javascript
cocos2dx骨骼动画Armature源码剖析(一)
2015/09/08 Javascript
JavaScript多图片上传案例
2015/09/28 Javascript
学习JavaScript设计模式(策略模式)
2015/11/26 Javascript
jQuery实现6位数字密码输入框
2016/12/29 Javascript
js弹出窗口简单实现代码
2017/03/22 Javascript
JavaScript 基础表单验证示例(纯Js实现)
2017/07/20 Javascript
react-native 圆弧拖动进度条实现的示例代码
2018/04/12 Javascript
Express的HTTP重定向到HTTPS的方法
2018/06/06 Javascript
JavaScript实现留言板案例
2020/03/17 Javascript
python线程、进程和协程详解
2016/07/19 Python
如何用Python合并lmdb文件
2018/07/02 Python
详解Python 切片语法
2019/06/10 Python
python爬虫 urllib模块发起post请求过程解析
2019/08/20 Python
Python lambda表达式filter、map、reduce函数用法解析
2019/09/11 Python
使用python自动追踪你的快递(物流推送邮箱)
2020/03/17 Python
土木工程实习生自我鉴定
2013/09/19 职场文书
计算机专业毕业生自荐信
2013/12/31 职场文书
优秀驾驶员先进事迹材料
2014/05/04 职场文书
五水共治一句话承诺
2014/05/30 职场文书
单位考核聘任报告
2015/03/02 职场文书
幼儿园中秋节活动总结
2015/03/23 职场文书
2015年秋季小班开学寄语
2015/05/27 职场文书
关于JavaScript回调函数的深入理解
2021/06/27 Javascript