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安全配置
Oct 09 PHP
PHP 中的面向对象编程:通向大型 PHP 工程的办法
Dec 03 PHP
不要轻信 PHP_SELF的安全问题
Sep 05 PHP
逆序二维数组插入一元素的php代码
Jun 08 PHP
无需重新编译php加入ftp扩展的解决方法
Feb 07 PHP
PHP学习笔记之字符串编码的转换和判断
May 22 PHP
PHP调用Linux命令权限不足问题解决方法
Feb 07 PHP
PHP中把对象数组转换成普通数组的方法
Jul 10 PHP
ThinkPHP路由详解
Jul 27 PHP
PHP微信发送推送消息乱码的解决方法
Feb 28 PHP
Laravel框架集成UEditor编辑器的方法图文与实例详解
Apr 17 PHP
tp5框架的增删改查操作示例
Oct 31 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代码
2007/03/03 PHP
php使用simplexml_load_file加载XML文件并显示XML的方法
2015/03/19 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
Javascript 同时提交多个Web表单的方法
2009/02/19 Javascript
jquery 学习之二 属性 文本与值(text,val)
2010/11/25 Javascript
Js操作Select大全(取值、设置选中等等)
2013/10/29 Javascript
node.js中的fs.existsSync方法使用说明
2014/12/17 Javascript
jQuery实现Tab菜单滚动切换的方法
2015/09/21 Javascript
移动端滑动插件Swipe教程
2016/10/16 Javascript
3分钟快速搭建nodejs本地服务器方法运行测试html/js
2017/04/01 NodeJs
js笔试题-接收get请求参数
2019/06/15 Javascript
基于vue+echarts 数据可视化大屏展示的方法示例
2020/03/09 Javascript
Vue this.$router.push(参数)实现页面跳转操作
2020/09/09 Javascript
javascript实现点击按钮切换轮播图功能
2020/09/23 Javascript
Vue——前端生成二维码的示例
2020/12/19 Vue.js
python输出当前目录下index.html文件路径的方法
2015/04/28 Python
在Python的struct模块中进行数据格式转换的方法
2015/06/17 Python
使用TensorFlow实现SVM
2018/09/06 Python
对python的bytes类型数据split分割切片方法
2018/12/04 Python
超简单使用Python换脸实例
2019/03/27 Python
python实现京东订单推送到测试环境,提供便利操作示例
2019/08/09 Python
python-序列解包(对可迭代元素的快速取值方法)
2019/08/24 Python
给 TensorFlow 变量进行赋值的方式
2020/02/10 Python
python3 自动打印出最新版本执行的mysql2redis实例
2020/04/09 Python
python argparse传入布尔参数false不生效的解决
2020/04/20 Python
安装Anaconda3及使用Jupyter的方法
2020/10/27 Python
ECCO爱步美国官网:来自丹麦的鞋履品牌
2016/11/23 全球购物
加拿大休闲和工业服装和鞋类零售商:L’Équipeur
2018/01/12 全球购物
中英双版中文教师求职信
2013/10/27 职场文书
出纳工作检讨书
2014/10/18 职场文书
在校大学生才艺比赛策划书怎么写?
2019/08/26 职场文书
php去除deprecated的实例方法
2021/11/17 PHP
Win11绿屏怎么办?Win11绿屏死机的解决方法
2021/11/21 数码科技
如何在python中实现ECDSA你知道吗
2021/11/23 Python
Django框架模板用法详解
2022/06/10 Python
Debian11 Xfce终端光标的颜色怎么设置?
2022/08/14 数码科技