淘宝Refrash_token签名错误的解决办法

本文详细介绍了在使用淘宝提供的.NET SDK进行应用开发时,遇到Refrash_token签名错误(406signerror)的问题,并分享了解决方案。通过将JAVA的示例翻译成C#代码,实现正确的Refrash_token签名过程,从而延长SessionKey的授权时间。

最近在做淘宝相关应用,想要通过Refrash_token来延长SessionKey的授权时间,但是总是报406 sign error.

经过多次尝试和多方询问,方才知道原来淘宝给的.net SDK里面的签名方法(SignTopRequest)是不能用于Refrash_token的签名。

只好老老实实的按照官方例子,把JAVA的翻译成C#的。

        private string GetRefrashSign(string appkey, string sessionKey, string refrashToken, string secret)
        {
            Dictionary<string, string> signParams = new Dictionary<string, string>();
            signParams.Add("appkey", appkey);
            signParams.Add("refresh_token", refrashToken);
            signParams.Add("sessionkey", sessionKey);
            //return TopUtils.SignTopRequest(signParams, secret,true).ToUpper();
            StringBuilder paramsString = new StringBuilder();
            foreach (KeyValuePair<string, string> param in signParams)
            {
                paramsString.Append(param.Key);
                paramsString.Append(param.Value);
            }
            paramsString.Append(secret);
            return GetMd5String(paramsString.ToString()).ToUpper();
        }
        private string GetMd5String(string paramsString)
        {
            MD5 md5 = MD5.Create();
            byte[] bytes = md5.ComputeHash(Encoding.UTF8.GetBytes(paramsString));
            StringBuilder sb = new StringBuilder();
            foreach (byte b in bytes)
                sb.AppendFormat("{0:X2}", b);
            return sb.ToString();
        }




<template> <div style="padding: 8px 8px;"> <!-- 搜索/高级搜索 --> <searchinput ref="search" :options="options" @reload="reload"> <template> <div style="padding: 5px 0;"> <el-button size="mini" type="primary" @click="newAdd()" >导出Excel</el-button > <el-button size="mini" type="primary" icon="el-icon-plus" @click="newAdd()" >新增项目</el-button > </div> </template> </searchinput> <div class="biaoge"> <!-- 表格 --> <avue-crud ref="crud" :data="tableData" :option="option" :page="page" @on-load="onLoad" class="guding" @selection-change="selectionChange" > <!-- <template slot-scope="{ row }" slot="vForm"> <el-row :span="24"> <el-col :span="24"> <treeselect v-model="row.basebybjmingcheng" :multiple="true" :options="treeData" value-consists-of="LEAF_PRIORITY" :tree="true" clearable placeholder="请选择部件名称" > </treeselect> </el-col> </el-row> </template> --> <template slot="basebybjmingcheng" slot-scope="{ row }"> <treeselect v-model="row.basebybjmingcheng" :options="treeData" value-consists-of="LEAF_PRIORITY" :tree="true" clearable placeholder="请选择部件名称" > </treeselect> </template> </avue-crud> </div> </div> </template> <script> import searchinput from "@/views/erp/controls/ctrsearchinput.vue"; import Treeselect from "@riophae/vue-treeselect"; import "@riophae/vue-treeselect/dist/vue-treeselect.css"; import { mapGetters } from "vuex"; import { geturl, posturl } from "@/api/ajax"; import { getsByxiangmuweihu, delByxiangmuweihu, postByxiangmuweihu, getByxiangmuweihu } from "@/api/baoyang/byxiangmuweihu"; export default { components: { searchinput, Treeselect }, data() { return { page: { pageSize: 20, currentPage: 1, total: 0 }, guding: "", tableData: [], option: { selectionWidth: 35, //行可勾选的宽度 indexWidth: 35, //序号的宽度 stripe: true, menuAlign: "center", menuWidth: 150, // dialogModal: false, // dialogEscape: true, // dialogDirection: "rtl", // dialogType: "drawer", tip: false, border: true, index: true, addBtn: false, delBtn: true, menu: true, //操作栏显隐 editBtn: true, columnBtn: false, refreshBtn: false, cancelBtn: false, indexFixed: false, selectionFixed: false, rowKey: "byxiangmuweihuid", indexLabel: "序号", selection: false, selectable: (row, index) => { return index === 1; }, column: [ { label: "设备名称", prop: "shebeimingcheng", overHidden: true, width: 150 }, { label: "部件名称", prop: "basebybjmingcheng", overHidden: true, width: 150, slot: true }, { label: "保养方式", prop: "baoyangfangshi", width: 80, type: "select", dicData: [ { label: "时间", value: "0" }, { label: "转数", value: "1" } ], overHidden: true }, { label: "保养周期", prop: "baoyangzhouqi", overHidden: true, width: 120 }, { label: "保养说明", prop: "byshuoming", overHidden: true }, { label: "保养用时", prop: "baoyangyongshi", overHidden: true, width: 120 }, { label: "参与人员", prop: "canyurenyuan", overHidden: true, width: 150 }, { label: "创建人", prop: "chuangjianren", overHidden: true, width: 150, display: false }, { label: "创建时间", prop: "chuangjianrq", type: "date", format: "MM-dd hh:mm", valueFormat: "yyyy-MM-dd hh:mm:ss", overHidden: true, width: 150, display: false } ] }, options: { placeholder: "", self: true, refrash: true, change: true, hideSearch: true, hideClickSearch: true, hideGroup: true, query: { __bianhao__: "byxiangmuweihu" }, columns: [ { title: "设备名称", prop: "shebeimingcheng", type: "input" }, { title: "保养方式", prop: "baoyangfangshi", type: "select", dicData: [ { label: "时间", value: "0" }, { label: "转数", value: "1" } ] }, { title: "参与人员", prop: "canyurenyuan", type: "input" } ] }, selectionList: [], treeData: [], mclist: [] }; }, computed: { ids() { let ids = []; this.selectionList.forEach(ele => { ids.push(ele.byxiangmuweihuid); }); return ids.join(","); }, ...mapGetters(["LIB"]) }, created() { geturl("/api/byxiangmuweihu/Getbybujian").then(res => { this.treeData = res.data.data; console.log("=============", this.treeData); }); window.addEventListener("setItem", () => { this.guding = sessionStorage.getItem("watchStorage"); }); }, methods: { reload(where) { Object.assign(this.options.query, where); this.onLoad(this.page); }, //表格内容加载事件 onLoad(page) { this.page = page; console.log(page); getsByxiangmuweihu( page.currentPage, page.pageSize, this.options.query ).then(res => { const tableList = res.data.data; this.page.total = tableList.total; this.tableData = tableList.records; //执行统计方法 this.$refs.search.loadGroup(this.page.total); //清空选择项 this.$refs.crud.toggleSelection(); }); }, //选中的数据 selectionChange(list) { this.selectionList = list; }, //刷新表格 refresh() { this.onLoad(this.page); }, newAdd() { this.$refs.crud.rowAdd(); } } }; </script> <style scoped lang="scss"></style> 为什么 treeselect 不显示? 新增执行的方法this.$refs.crud.rowAdd();
最新发布
11-14
<think> 我们正在处理一个Vue项目中的问题,涉及两个主要点: 1. treeselect组件不显示的原因分析 2. `this.$refs.crud.rowAdd()`方法的相关分析 首先,关于treeselect不显示的问题,可能的原因包括但不限于: - 组件未正确注册或引入 - 数据源问题(数据未加载、格式不正确) - 样式冲突或未正确引入样式 - 绑定值的问题(如v-model绑定的值在数据源中不存在) - 组件的props配置错误(如options未传递或格式不对) 其次,对于`this.$refs.crud.rowAdd()`方法,我们需要知道: - `crud`是一个通过ref注册的组件引用,通常是一个封装了CRUD操作的组件。 - `rowAdd`方法通常是该CRUD组件中定义的一个方法,用于触发新增行的操作(例如打开一个新增对话框或初始化一个空表单)。 由于问题描述较为简洁,我们只能给出一般性的分析和排查步骤。 下面将分别详细说明: </think> ### Vue项目中 treeselect 不显示的原因分析 在Vue项目中使用treeselect组件时,不显示的常见原因包括: 1. **组件未正确注册** - 未在组件中导入并注册`Treeselect`组件 - 缺少`components: { Treeselect }`声明 ```javascript import Treeselect from '@riophae/vue-treeselect' import '@riophae/vue-treeselect/dist/vue-treeselect.css' export default { components: { Treeselect }, // ... } ``` 2. **数据格式问题** - 数据结构不符合要求,treeselect需要特定格式的嵌套数据 - 缺少必需的`id`、`label`、`children`字段 ```javascript // 正确格式示例 options: [{ id: 'group1', label: '分组1', children: [{ id: 'child1', label: '子选项1' }] }] ``` 3. **样式未引入** - 忘记导入CSS文件(最常见原因) - 样式被全局样式覆盖 ```javascript import '@riophae/vue-treeselect/dist/vue-treeselect.css' // 必须引入 ``` 4. **绑定值问题** - `v-model`绑定值类型错误(应匹配节点id类型) - 初始值为`null`或`undefined`导致不显示 ```html <treeselect v-model="selectedValue" :options="options" /> ``` 5. **DOM渲染时机问题** - 在数据加载完成前渲染组件 - 使用`v-if`而非`v-show`导致条件不满足时不渲染 ```html <treeselect v-if="optionsLoaded" ... /> <!-- 应确保optionsLoaded为true --> ``` 6. **版本兼容性问题** - Vue 2/3 使用不匹配的treeselect版本 - 插件冲突(如同时使用Element UI) --- ### `this.$refs.crud.rowAdd()` 方法分析 #### 方法作用 此方法通常用于CRUD(增删改查)组件中,主要功能是**触发新增行操作**: 1. 打开新增表单对话框 2. 重置表单初始状态 3. 初始化默认值 4. 切换至创建模式 #### 典型实现逻辑 ```javascript // 在CRUD组件中的实现示例 export default { methods: { rowAdd() { this.dialogVisible = true // 显示对话框 this.formMode = 'create' // 设置为创建模式 this.resetForm() // 重置表单 this.initializeDefaults() // 设置默认值 } } } ``` #### 使用注意事项 1. **Ref引用有效性** - 确保`<crud>`组件已设置`ref="crud"` ```html <template> <crud ref="crud"></crud> </template> ``` 2. **调用时机** - 需在DOM更新完成后调用(如在`mounted`或事件回调中) - 避免在`created`生命周期中调用 3. **组件封装要求** - 被调用的CRUD组件需实现`rowAdd`方法 - 方法应暴露为组件公共API 4. **常见错误** ```javascript // 错误:组件未渲染完成时调用 created() { this.$refs.crud.rowAdd() // 此时ref尚未注册 } // 正确:在事件回调中调用 methods: { handleAdd() { this.$nextTick(() => { this.$refs.crud.rowAdd() }) } } ``` #### 替代方案 ```javascript // 更安全的调用方式(添加存在性校验) if (this.$refs.crud && this.$refs.crud.rowAdd) { this.$refs.crud.rowAdd() } ``` --- ### 排查流程图 ```mermaid graph TD A[treeselect不显示] --> B{组件注册?} B -->|是| C{样式引入?} B -->|否| D[注册组件] C -->|是| E{数据格式正确?} C -->|否| F[导入CSS] E -->|是| G{绑定值有效?} E -->|否| H[调整数据结构] G -->|是| I{控制台报错?} G -->|否| J[设置初始值] I -->|无| K[检查DOM渲染时机] I -->|有| L[根据错误调试] ``` ### 最佳实践建议 1. 使用`@riophae/vue-treeselect`最新稳定版(当前v0.4.0) 2. 数据加载完成后渲染组件: ```html <treeselect v-if="isDataReady" ... /> ``` 3. 添加加载状态: ```html <treeselect :options="options" :loading="isLoading" /> ``` ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值