当前位置:   article > 正文

微信小程序获取手机号码41003

41003

在我调试的时候目前预定这两种情况

第一种情况 session_key 过期了,这个值是变化的,你去拿已经存起来的 session_key 获取手机号码,会报41003错错误

解决方案:让前端传小程序code码。后台服务端重新请求小程序官方接口,拿最新的session_key。

获取session_key文档地址https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html

具体请看下面的我的实践代码

第二种情况,前端更换小程序的appid导致的

原因:一开始我们用的自己公司的appid在小程序的开发者工具配置,上线的时候换成了客户的appid,这种情况去前端和服务端数据解密请求解密时一直返回41003。

解决方案:清空小程序开发者工具全部缓存,重新编辑运行就可以解决

有问题欢迎进裙 721200119 交流

楼主php很乐意为你解答开发者遇到的任何问题

下面贴出第一种解决方案我用的代码:

  1. public function decryptdata()
  2. {
  3. if($this->request->isPost()){
  4. $user = $this->auth->getUser();
  5. $encryptedData = $this->request->post('encryptedData');
  6. $iv = $this->request->post('iv');
  7. $config = get_addon_config('cms');
  8. $input = input();
  9. if(empty($input['code'])){
  10. $this->error('参数必传');
  11. }
  12. if(empty($encryptedData) || empty($iv) || empty($config['wxappid'] || empty($sessionKey))){
  13. $this->error('缺少参数');
  14. }
  15. $param['appid'] = $config['wxappid']; //小程序id
  16. $param['secret'] = $config['wxappsecret']; //小程序密钥
  17. $param['js_code'] = define_str_replace($input['code']);
  18. $param['grant_type'] = 'authorization_code';
  19. $http_key = httpCurl('https://api.weixin.qq.com/sns/jscode2session', $param, 'GET');
  20. $session_key = json_decode($http_key,true);
  21. if (!empty($session_key['session_key'])) {
  22. $pc = new WXBizDataCrypt($config['wxappid'], $session_key['session_key']);
  23. $errCode = $pc->decryptData($encryptedData, $iv, $data);
  24. if ($errCode == 0) {
  25. $data = json_decode($data,true);
  26. if(!empty($data['phoneNumber'])){
  27. $user->mobile = $data['phoneNumber'];
  28. $user->save();
  29. }
  30. $this->success('请求成功',$data['phoneNumber']);
  31. } else {
  32. $this->error('获取失败'.$errCode);
  33. }
  34. } else{
  35. $this->error('获取失败'.$http_key);
  36. }
  37. }
  38. }
  39. //用到的类文件
  40. class WXBizDataCrypt
  41. {
  42. private $appid;
  43. private $sessionKey;
  44. /**
  45. * 构造函数
  46. * @param $sessionKey string 用户在小程序登录后获取的会话密钥
  47. * @param $appid string 小程序的appid
  48. */
  49. public function __construct( $appid, $sessionKey)
  50. {
  51. $this->sessionKey = $sessionKey;
  52. $this->appid = $appid;
  53. }
  54. /**
  55. * 检验数据的真实性,并且获取解密后的明文.
  56. * @param $encryptedData string 加密的用户数据
  57. * @param $iv string 与用户数据一同返回的初始向量
  58. * @param $data string 解密后的原文
  59. *
  60. * @return int 成功0,失败返回对应的错误码
  61. */
  62. public function decryptData( $encryptedData, $iv, &$data )
  63. {
  64. if (strlen($this->sessionKey) != 24) {
  65. return ErrorCode::$IllegalAesKey;
  66. }
  67. $aesKey=base64_decode($this->sessionKey);
  68. if (strlen($iv) != 24) {
  69. return ErrorCode::$IllegalIv;
  70. }
  71. $aesIV=base64_decode($iv);
  72. $aesCipher=base64_decode($encryptedData);
  73. $result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
  74. $dataObj=json_decode( $result );
  75. if( $dataObj == NULL )
  76. {
  77. return ErrorCode::$IllegalBuffer;
  78. }
  79. if( $dataObj->watermark->appid != $this->appid )
  80. {
  81. return ErrorCode::$IllegalBuffer;
  82. }
  83. $data = $result;
  84. return ErrorCode::$OK;
  85. }
  86. }
  87. class ErrorCode
  88. {
  89. public static $OK = 0;
  90. public static $IllegalAesKey = -41001;
  91. public static $IllegalIv = -41002;
  92. public static $IllegalBuffer = -41003;
  93. public static $DecodeBase64Error = -41004;
  94. }
  95. //用到的两个函数
  96. function define_str_replace($data)
  97. {
  98. return str_replace(' ','+',$data);
  99. }
  100. function httpCurl($url, $params, $method = 'POST', $header = array(), $multi = false){
  101. date_default_timezone_set('PRC');
  102. $opts = array(
  103. CURLOPT_TIMEOUT => 30,
  104. CURLOPT_RETURNTRANSFER => 1,
  105. CURLOPT_SSL_VERIFYPEER => false,
  106. CURLOPT_SSL_VERIFYHOST => false,
  107. CURLOPT_HTTPHEADER => $header,
  108. CURLOPT_COOKIESESSION => true,
  109. CURLOPT_FOLLOWLOCATION => 1,
  110. CURLOPT_COOKIE =>session_name().'='.session_id(),
  111. );
  112. /* 根据请求类型设置特定参数 */
  113. switch(strtoupper($method)){
  114. case 'GET':
  115. // $opts[CURLOPT_URL] = $url . '?' . http_build_query($params);
  116. // 链接后拼接参数 & 非?
  117. $opts[CURLOPT_URL] = $url . '?' . http_build_query($params);
  118. break;
  119. case 'POST':
  120. //判断是否传输文件
  121. $params = $multi ? $params : http_build_query($params);
  122. $opts[CURLOPT_URL] = $url;
  123. $opts[CURLOPT_POST] = 1;
  124. $opts[CURLOPT_POSTFIELDS] = $params;
  125. break;
  126. default:
  127. throw new Exception('不支持的请求方式!');
  128. }
  129. /* 初始化并执行curl请求 */
  130. $ch = curl_init();
  131. curl_setopt_array($ch, $opts);
  132. $data = curl_exec($ch);
  133. $error = curl_error($ch);
  134. curl_close($ch);
  135. if($error) throw new Exception('请求发生错误:' . $error);
  136. return $data;
  137. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/525058
推荐阅读
相关标签
  

闽ICP备14008679号