react + antd Table實現表格資料合併
阿新 • • 發佈:2020-07-15
今天一個兩年前做的公眾號專案 要更改主體,隨之而來的是公眾號的遷移。 公眾號遷移後關注的粉絲也會對應的進行遷移,還會給粉絲髮送相關通知。
大體流程如下圖
遷移的具體步驟我就不細說了。今天主要說的是 遷移主體後 對應的使用者openid也會變化,也就是說你的程式如果公眾號登入是以微信openid為唯一標識的話,
那你的使用者系統經過一次公眾號變更後就會出現問題。 老使用者再次授權後 系統可能認為是新使用者,而且通過原來的openid 也無法推送模板訊息等功能。
微信方面當然也考慮到了相關問題 。給出了相關的介面去處理這個問題,這就是今天說的openid轉換介面 。
相關內容如下
openid轉換介面
賬號遷移後,粉絲的openid會變化,微信使用者關注不同的公眾號,對應的openid是不一樣的,遷移成功後,粉絲的openid以目標帳號(即新公眾號)對應的OpenID為準。但開發者可以通過開發介面轉換openid,開發文件可以參考: 提供一個openid轉換的API介面,當帳號遷移後,可以通過該介面:1. 將原帳號粉絲的openid轉換為新帳號的openid。
2. 將有授權關係使用者的openid轉換為新帳號的openid。
3. 將卡券關聯使用者的openid轉換為新帳號的openid。
◆ 原帳號:準備要遷移的帳號,當稽核完成且管理員確認後即被回收。
◆ 新帳號:用來接納粉絲的帳號。新帳號在整個流程中均能正常使用。
一定要按照下面的步驟來操作。
1. 一定要在原帳號被凍結之前,最好是準備提交稽核前,獲取原帳號的使用者列表。如果沒有原帳號的使用者列表,用不了轉換工具。如果原賬號被回收,這時候也沒辦法呼叫介面獲取使用者列表。
如何獲取使用者列表見這裡:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140840
2. 轉換openid的API介面如下,可在帳號遷移稽核完成後開始呼叫,並最多保留15天。若帳號遷移沒完成,呼叫時無返回結果或報錯。帳號遷移15天后,該轉換介面將會失效、無法拉取到資料。
◆ URL:http://api.weixin.qq.com/cgi-bin/changeopenid?access_token=xxxxx
◆ 請求方式:post
◆ 請求資料:
{
"from_appid":"xxxxxxxx",//此處為原帳號的appid
"openid_list":["oEmYbwN-n24jxvk4Sox81qedINkQ","oEmYbwH9uVd4RKJk7ZZg6S
zL6tTo"]//需要轉換的openid,即第1步中拉取的原帳號使用者列表,這些必須是舊賬號目前關注的才行,否則會出錯;一次最多100個,不能多。
}
◆ 輸出資料:
{
"errcode": 0,
"errmsg": "ok",
"result_list": [
{
"ori_openid": "oEmYbwN-n24jxvk4Sox81qedINkQ",
"new_openid": "o2FwqwI9xCsVadFah_HtpPfaR-X4",
"err_msg": "ok"
},
{
"ori_openid": "oEmYbwH9uVd4RKJk7ZZg6SzL6tTo",
"err_msg": "ori_openid error"//這個openid目前沒有關注舊公眾號
}
]
}
◆ 錯誤碼:
63178:from_appid引數錯誤,和呼叫的賬號並沒有遷移關係
Ori_openid error:openid目前沒有關注舊公眾號。或者是將from_appid搞錯了,用成了新帳號的appid。
其中我認為比較重要的內容標註了顏色 ,希望你要遷移的賬號滿足他的條件 下面是我寫到相關實現程式碼
1 public function getOpenId(){ 2 $rows='100'; 3 $page=input('id'); 4 $info=\db('users')->paginate($rows,'',['page'=>$page]); 5 $data= $info->items(); 6 $open_id=array_column($data,'openid'); 7 // dump($open_id); 8 9 $postData['from_appid']='******'; //老的APPID 10 $postData['openid_list']=$open_id; 11 $config=[ 12 'app_id' => '*******', // 新的AppID 13 'secret' => '***********', 14 ]; 15 $Wechat=new Application($config);//這裡用是Easywechat 16 $Token=$Wechat->access_token; 17 $token=$Token->getToken(); 18 19 $url='https://api.weixin.qq.com/cgi-bin/changeopenid?access_token='.$token; 20 //$result= $this->curlPost($url,json_encode($postData,true),'','','json'); 21 $result= $this->post_by_curl($url,json_encode($postData,true)); //自己找一個curl方法 22 $return=json_decode($result,true); 23 $result=$return['result_list']; 24 25 foreach ($result as $k=>$v){ 26 27 if ($v['err_msg']=='ok'){ 28 $update['openid']=$v['new_openid']; 29 $update['is_update']=1; 30 \db('users')->where('openid',$v['ori_openid'])->update($update); 31 } 32 } 33 }
需要注意的是 這個介面一次只能獲取100條資料 , 話句話說 你只能一次一百條一百條的更新
當然 你可以選擇用訊息佇列進行處理這個資料 但是我選擇的是比較簡單的方法 : 前臺頁面定時器請求
下面附上html程式碼
1 <!DOCTYPE html> 2 <html lang="en"> 3 <script src="/static/js/jquery.js"></script> 4 <head> 5 <meta charset="UTF-8"> 6 <title>Title</title> 7 <div id="test">1</div> 8 </head> 9 <body> 10 <script> 11 var i=1; 12 function test(){ 13 var url='http://百度/portal/test/getOpenId/id/'+i 14 $.ajax({ 15 url:url, 16 type:'GET', 17 success:function (res) { 18 $('#test').html(i) 19 } 20 }) 21 i++; 22 } 23 window.setInterval(test,5000); 24 </script> 25 </body> 26 </html>
不過這個時間會比較長
我寫完部落格才更改了4萬條 你可以看一下你伺服器的響應執行速度 適當的調整這個引數