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中调用JAVA
Oct 09 PHP
提取HTML标签
Oct 09 PHP
NOT NULL 和NULL
Jan 15 PHP
编写Smarty插件在模板中直接加载数据的详细介绍
Jun 26 PHP
php实现执行某一操作时弹出确认、取消对话框
Dec 30 PHP
浅谈Eclipse PDT调试PHP程序
Jun 09 PHP
用 Composer构建自己的 PHP 框架之构建路由
Oct 30 PHP
php实现二进制和文本相互转换的方法
Apr 18 PHP
PHP实现过滤掉非汉字字符只保留中文字符
Jun 04 PHP
各种快递查询--Api接口
Apr 26 PHP
PHP实现的ID混淆算法类与用法示例
Aug 10 PHP
wordpress自定义标签云与随机获取标签的方法详解
Mar 22 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
WINDOWS服务器安装多套PHP的另类解决方案
2006/10/09 PHP
PHP HTML代码串截取代码
2008/12/29 PHP
thinkphp微信开发(消息加密解密)
2015/12/02 PHP
CI框架文件上传类及图像处理类用法分析
2016/05/18 PHP
小议Function.apply() 之一------(函数的劫持与对象的复制)
2006/11/30 Javascript
js Function类型
2011/12/04 Javascript
jQuery中(function(){})()执行顺序的理解
2013/03/05 Javascript
判断是否安装flash player及当前版本的JS代码
2013/08/08 Javascript
Json和Jsonp理论实例代码详解
2013/11/15 Javascript
javascript基本类型详解
2014/11/28 Javascript
JS实现横向拉伸动感伸缩菜单效果代码
2015/09/04 Javascript
JQuery ztree带筛选、异步加载实例讲解
2016/02/25 Javascript
js改变透明度实现轮播图的算法
2020/08/24 Javascript
jQuery zTree 异步加载添加子节点重复问题
2017/11/29 jQuery
vue使用element-ui的el-input监听不了回车事件的解决方法
2018/01/12 Javascript
Layui实现主窗口和Iframe层参数传递
2019/11/14 Javascript
python下如何让web元素的生成更简单的分析
2008/07/17 Python
python统计字符串中指定字符出现次数的方法
2015/04/04 Python
Python类定义和类继承详解
2015/05/08 Python
Django框架中数据的连锁查询和限制返回数据的方法
2015/07/17 Python
python利用装饰器进行运算的实例分析
2015/08/04 Python
利用python list完成最简单的DB连接池方法
2019/08/09 Python
python根据时间获取周数代码实例
2019/09/30 Python
通过实例解析Python RPC实现原理及方法
2020/07/07 Python
selenium设置浏览器为headless无头模式(Chrome和Firefox)
2021/01/08 Python
HTML5 Canvas旋转动画的2个代码例子(一个旋转的太极图效果)
2014/04/10 HTML / CSS
canvas实现二维码和图片合成的示例代码
2018/08/01 HTML / CSS
存储过程和sql语句的优缺点
2014/07/02 面试题
纺织工程专业个人求职信范文
2014/01/27 职场文书
教师节商场活动方案
2014/02/13 职场文书
违反校纪校规检讨书
2014/02/15 职场文书
党员公开承诺书内容
2014/05/20 职场文书
领导班子四风问题个人对照检查材料
2014/10/04 职场文书
作文批改评语
2014/12/25 职场文书
使用PostGIS完成两点间的河流轨迹及流经长度的计算(推荐)
2022/01/18 PostgreSQL
win sever 2022如何占用操作主机角色
2022/06/25 Servers