小程序encryptedData数据解密报错误码-41003 ? 神奇的问题!!!!!!

小程序encryptedData数据解密报错误码-41003 ?

希望我的说明能给大家解惑,本文参考了官方的文档以及借鉴了其他小伙伴的经验(参考链接

联系QQ:1219481875(备注理由)

小程序-41003造成的主要原因在于wx.login方法在wx.getUserProfile方法之后了。到时session_key会话id顺序混乱

以下是全部的实现代码(下载链接
小程序代码块
wx.login调用
我这里是将wx.login放在app.js中的。大家按自己的实际情况来。code发送到服务端返回的session_key存入缓存,等待wx.getUserProfile后与iv和encryptedData一起发给服务端解密。获取用户信息。

有小伙伴说wx.getUserProfile后前端就能拿到用户信息了,直接明文传送不就好了,省的解密。其实这样很容易被一些有心人注入数据。所以大家还是要注意下数据安全哦!!!!

// app.js
App({
  onLaunch() {
    // 展示本地存储能力
    const logs = wx.getStorageSync('logs') || []
    logs.unshift(Date.now())
    wx.setStorageSync('logs', logs)

    // 登录
    wx.login({
      success: res => {
        // 发送 res.code 到后台换取 openId, sessionKey, unionId
        // console.log(res.code)
        wx.request({
          url: 'http://wxlogin.cn/login.php', //仅为示例,并非真实的接口地址
          method:'POST',
          data: {act:'login',code:res.code},
          header: {
            'content-type': 'application/x-www-form-urlencoded' // 默认值
          },
          success (res) {
            wx.setStorage({
              key:"login_value",
              data:res
            })
          }
        })
      }
    })
  },
  globalData: {
    userInfo: null
  }
})

小程序界面点击

<!--index.wxml-->
<view class="container">
  <view class="userinfo">
    <block wx:if="{{canIUseOpenData}}">
      <view class="userinfo-avatar" bindtap="bindViewTap">
        <open-data type="userAvatarUrl"></open-data>
      </view>
      <open-data type="userNickName"></open-data>
    </block>
    <block wx:elif="{{!hasUserInfo}}">
      <button wx:if="{{canIUseGetUserProfile}}" bindtap="getUserProfile"> 获取头像昵称 </button>
      <!-- <button wx:elif="{{canIUse}}" open-type="getUserInfo" bindgetuserinfo="getUserInfo"> 获取头像昵称 </button> -->
      <view wx:else> 请使用1.4.4及以上版本基础库 </view>
    </block>
    <block wx:else>
      <image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" mode="cover"></image>
      <text class="userinfo-nickname">{{userInfo.nickName}}</text>
    </block>
  </view>
  <view class="usermotto">
    <text class="user-motto">{{motto}}</text>
  </view>
</view>

触发wx.getUserProfile

// index.js
// 获取应用实例
const app = getApp()

Page({
  data: {
    motto: 'Hello World',
    userInfo: {},
    hasUserInfo: false,
    canIUse: wx.canIUse('button.open-type.getUserInfo'),
    canIUseGetUserProfile: false,
    //canIUseOpenData: wx.canIUse('open-data.type.userAvatarUrl') && wx.canIUse('open-data.type.userNickName') // 如需尝试获取用户信息可改为false
    canIUseOpenData:false
  },
  // 事件处理函数
  bindViewTap() {
    wx.navigateTo({
      url: '../logs/logs'
    })
  },
  onLoad() {
    if (wx.getUserProfile) {
      this.setData({
        canIUseGetUserProfile: true
      })
    }
  },
  getUserProfile(e) {
    // 推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户个人信息均需用户确认,开发者妥善保管用户快速填写的头像昵称,避免重复弹窗
    wx.getUserProfile({
      desc: '展示用户信息', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
      success: (res1) => {
        wx.getStorage({
          key: 'login_value',
          success (res) {
            let login_value=res.data.data;
            console.log(login_value);
            wx.request({
              url: 'http://wxlogin.cn/login.php', //仅为示例,并非真实的接口地址
              method:'POST',
              data: {act:'login_auth',session_key:login_value.session_key,openid:login_value.openid,encryptedData:res1.encryptedData,iv:res1.iv},
              header: {
                'content-type': 'application/x-www-form-urlencoded' // 默认值
              },
              success (res) {
                console.log(res);
              }
            })



          }
        })

        

        
      }
    })
  },
  getUserInfo(e) {
    // 不推荐使用getUserInfo获取用户信息,预计自2021年4月13日起,getUserInfo将不再弹出弹窗,并直接返回匿名的用户个人信息
    console.log(e)
    this.setData({
      userInfo: e.detail.userInfo,
      hasUserInfo: true
    })
  }



})

php服务端代码块

<?php


$appid="XXX";
$appsecret="XXX";


$act=$_POST['act'];

    if($act=='login'){
        $code=$_POST['code'];
        if(empty($code)){
            die('code不存在');
        }
        $url="https://api.weixin.qq.com/sns/jscode2session?appid=$appid&secret=$appsecret&js_code=$code&grant_type=authorization_code";
        $data=http_curl($url);
        exit(json_encode($data));
    }
            

    if($act=='login_auth'){
        // echo $_POST['session_key'];
        include_once "./wx/wxBizDataCrypt.php";
        $pc = new WXBizDataCrypt($appid, $_POST['session_key']);
        $errCode = $pc->decryptData($_POST['encryptedData'],$_POST['iv'], $data );

        if ($errCode == 0) {
            print($data . "\n");
        } else {
            print($errCode . "\n");
        }
    }






function http_curl($url,$type='get',$res='json',$arr=''){
    //初始化 curl
    $ch = curl_init();
    //设置curl的参数
    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    //处理证书问题
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    //处理结束
    if($type == 'post'){
        //type 为post
        curl_setopt($ch,CURLOPT_POST,1);
        curl_setopt($ch,CURLOPT_POSTFIELDS,$arr);
    }
    //采集
    $output = curl_exec($ch);
    //关闭
    if(curl_errno($ch)){
        return curl_errno($ch);   //报错
    }else{
        curl_close($ch);
        return json_decode($output,true);  //ok
    }
}







  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于您没有提供更具体的信息,我无法提供完整的解密代码。但是,以下是一个基本的字节跳动小程序接入示例代码: ```php <?php // 小程序 appid 和 secret $appid = 'your_appid'; $secret = 'your_secret'; // 从前端获取的加密数据和加密向量 $encryptedData = $_POST['encryptedData']; $iv = $_POST['iv']; // 获取 access_token $url = 'https://developer.toutiao.com/api/apps/token'; $params = [ 'appid' => $appid, 'secret' => $secret, 'grant_type' => 'client_credential', ]; $response = json_decode(httpGet($url, $params)); $accessToken = $response->access_token; // 解密数据 $url = 'https://developer.toutiao.com/api/apps/jscode2session'; $params = [ 'appid' => $appid, 'secret' => $secret, 'code' => $_POST['code'], ]; $response = json_decode(httpGet($url, $params)); $sessionKey = $response->session_key; $pc = new Prpcrypt($sessionKey); $result = $pc->decryptData($encryptedData, $iv); $data = json_decode($result); // 处理解密后的数据 // ... // httpGet 函数用于发送 GET 请求 function httpGet($url, $params) { $url .= '?' . http_build_query($params); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); return $response; } // Prpcrypt 类用于解密数据 class Prpcrypt { private $key; public function __construct($key) { $this->key = base64_decode($key . '='); } public function decryptData($encryptedData, $iv) { $decrypted = openssl_decrypt( base64_decode($encryptedData), 'AES-128-CBC', $this->key, OPENSSL_RAW_DATA, base64_decode($iv) ); return $decrypted; } } ``` 请注意,上述代码仅用于演示目的,您需要根据自己的实际情况进行调整和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值