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完整的日历类(CLASS)
Nov 27 PHP
MYSQL环境变量设置方法
Jan 15 PHP
php 验证码制作(网树注释思想)
Jul 20 PHP
PHP SPL使用方法和他的威力
Nov 12 PHP
实例讲解PHP面向对象之多态
Aug 20 PHP
php采用curl模仿登录人人网发布动态的方法
Nov 07 PHP
Yii核心组件AssetManager原理分析
Dec 02 PHP
php简单实现sql防注入的方法
Apr 22 PHP
php opendir()列出目录下所有文件的实例代码
Oct 02 PHP
php实现微信企业号支付个人的方法详解
Jul 26 PHP
Laravel 的数据库迁移的方法
Jul 31 PHP
PHP实现一个轻量级容器的方法
Jan 28 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 快速生成 Flash 动画的方法
2007/03/06 PHP
PHP 开源框架22个简单简介
2009/08/24 PHP
PHP学习笔记之一
2011/01/17 PHP
一个简洁实用的PHP缓存类完整实例
2014/07/26 PHP
PHP使用zlib扩展实现GZIP压缩输出的方法详解
2018/04/09 PHP
PHP从尾到头打印链表实例讲解
2018/09/27 PHP
用jquery实现学校的校历(asp.net+jquery ui 1.72)
2010/01/01 Javascript
javascript面向对象之二 命名空间
2011/02/08 Javascript
关于jQuery UI 使用心得及技巧
2012/10/10 Javascript
jquery实现的图片点击滚动效果
2014/04/29 Javascript
动态读取JSON解析键值对的方法
2014/06/03 Javascript
jQuery数据检索中根据关键字快速定位GridView指定行的实现方法
2016/06/08 Javascript
原生JavaScript实现Tooltip浮动提示框特效
2017/03/07 Javascript
JavaScript实现图片切换效果
2017/08/12 Javascript
详解如何实现一个简单的Node.js脚手架
2017/12/04 Javascript
解决在vue项目中,发版之后,背景图片报错,路径不对的问题
2018/03/06 Javascript
angularjs中判断ng-repeat是否迭代完的实例
2018/09/12 Javascript
微信小程序 image组件遇到的问题
2019/05/28 Javascript
bootstrap table插件动态加载表头
2019/07/19 Javascript
Windows上node.js的多版本管理工具用法实例分析
2019/11/06 Javascript
[38:30]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第一场2
2014/05/24 DOTA
Python实现股市信息下载的方法
2015/06/15 Python
python基于socket实现的UDP及TCP通讯功能示例
2019/11/01 Python
python代码区分大小写吗
2020/06/17 Python
几款Python编译器比较与推荐(小结)
2020/10/15 Python
澳大利亚领先的在线美容商店:Facial Co
2017/10/22 全球购物
法国在线购买汽车轮胎网站:123pneus.fr
2019/02/25 全球购物
《爱如茉莉》教后反思
2014/04/12 职场文书
领导参观欢迎词
2015/01/26 职场文书
建筑安全员岗位职责
2015/02/15 职场文书
民政工作个人总结
2015/02/28 职场文书
建筑技术负责人岗位职责
2015/04/13 职场文书
2015年企业工作总结范文
2015/04/28 职场文书
学习焦裕禄先进事迹心得体会
2016/01/23 职场文书
技术入股合作协议书
2016/03/21 职场文书
springboot为异步任务规划自定义线程池的实现
2022/06/14 Java/Android