微信公眾平台 分享介面踩坑記

2022-02-17 20:37:59 字數 4184 閱讀 9204

一、按照文件,第一步要繫結安全網域名稱,即「js介面安全網域名稱」(此處標記1號坑)

三、第三步通過config介面注入許可權驗證配置。這裡面的引數全部都要從後端獲取,我的方案是服務端渲染。如果驗證不通過最有可能的原因是簽名演算法錯誤。此步驟後端有很多的工作要做:先獲取access_token,再根據它獲取jsapi_ticket,然後再寫簽名演算法進行計算得出簽名,才將這些資料渲染到前端頁面上。(此處標記踩坑點)

四、第四步ready和error介面,並且將分享介面寫在ready內。

最理想的是繫結**位址,例如www.baidu.com。如果暫時不知道如何辦成,可以先綁乙個路徑,如www.baidu.com/mp。

為什麼這裡是1號坑?因為你如果繫結的是路徑,你要分享的鏈結一定要在繫結的這個路徑下,即使是同乙個網域名稱,不在這個路徑下,對不起,簽名非法。

所以如果你想讓該網域名稱下所有的鏈結都可以用上自定義分享樣式,就要將其繫結**位址。

1.獲取access_token。(二號大坑,內含若干小坑)

此處要注意,(一)服務號和企業號是不一樣的!

(2)獲取token的鏈結不一樣,前者是api開頭,後者是qyapi開頭。我做的是服務號(雖然認證主體也是企業),位址是

(二)兩種access_token要區別清楚

(1)請求位址和

引數不一樣,前者位址是

後者是。此處我們用的是後者

(2)請求次數不一樣。前者可以無限次獲取,後者獲取次數非常有限(具體次數不詳),官方建議自己設快取,且有效期7200秒。

(三)如果access_token獲取不對,下一步會報錯,官方有提供測試獲取token

2.獲取jsapi_ticket(三號大坑)

確保token獲取正確後,我們來獲取ticket。同樣地,

(1)要區別服務號和企業號,因為請求位址都不一樣,此處是

不含引數)

(2)獲取次數有限,有效期同7200s,需設快取。

3.簽名演算法

這裡不多說,官方有提供簽名演算法的驗證檢測。

除錯沒有報錯,測試分享成功,本以為大功告成,可又出了一些問題?

ios端分享正常,android端卻還是自定義之前的老樣子

無論是io

s端還是android端,點選第一次分享出來的鏈結,再次分享,又回到了老樣子

解決:python django後端:

def get_accesstoken():

"獲取access_token"

"向伺服器獲取token"

try:

url = u''

params =

res = requests.get(url, params=params).json()

access_token = res['access_token']

# 存redis快取

conn.hmset("access_token", )

return access_token

except exception as e:

traceback.print_exc()

return httpresponse(json.dumps('access_token獲取失敗:%s' % e))

# 首先取快取

conn = redis.strictredis(host='127.0.0.1', port='6379')

redis_token = conn.hgetall("access_token")

now_time = time.time()

if redis_token: # 如果有token快取

redis_time = float(str(redis_token[b"timestamp"], encoding="utf-8"))

if now_time - redis_time < 6000: # 如果token沒過期

access_token = str(redis_token[b"token"], encoding="utf-8")

else: # 如果已過期,重新獲取

else: # 如果沒有快取,建立乙個

return access_token

def get_jsapiticket(access_token):

"獲取 jsapi_ticket"

return httpresponse(json.dumps('jsapi獲取失敗:%s' % e))

# 首先取快取

conn = redis.strictredis(host='127.0.0.1', port='6379')

redis_jsapi = conn.hgetall("jsapi")

now_time = time.time()

if redis_jsapi: # 如果有token快取

redis_time = float(str(redis_jsapi[b"timestamp"], encoding="utf-8"))

if now_time - redis_time < 6000: # 如果token沒過期

jsapi_ticket = str(redis_jsapi[b"ticket"], encoding="utf-8")

else: # 如果已過期,重新獲取

else: # 如果沒有快取,建立乙個

return jsapi_ticket

def share(url):

"自定義分享"

# 獲取access_token

access_token = get_accesstoken()

# 獲取jsapi_ticket

jsapi_ticket = get_jsapiticket(access_token)

if jsapi_ticket is not none:

# 簽名演算法

class sign:

def __init__(self, jsapi_ticket, url):

self.ret =

def __create_nonce_str(self):

return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(15))

def __create_timestamp(self):

return int(time.time())

def sign(self):

string = '&'.join(['%s=%s' % (key.lower(), self.ret[key]) for key in sorted(self.ret)]).encode(

encoding="utf-8")

self.ret['signature'] = hashlib.sha1(string).hexdigest()

return self.ret

sign = sign(jsapi_ticket, url)

we_share = sign.sign()

return we_share

else:

print("jsapi為空,share沒有返回值")

前端:

微信小程式踩坑記

img v weui uploader bd style width 750rpx height 400rpx background color pink 以下為無效樣式 2.image影象寬高設定失敗,原因是在wxml中通過style屬性直接設定是無效的,需要通過class命名然後在wxss中進行...

微信公眾平台開發 2 微信端分享功能

建議詳細參考文件後再考慮 的編寫 二.實現 php 及部分問題引導 我提供的 就是下圖中的幾個簡單檔案 在此提供 sharepage.php 簡單 以便參考講解。其中提出幾點需要注意的是 3 保證 wx.config 的資訊配置的正確,debug如果為true可以提示操作的過程,測試沒有問題後可以改...

踩坑 微信高階群發介面

1.根據openid列表 post例項 msgtype mpnews send ignore reprint 0 touser表示使用者openid列表,length至少為2,否則會報錯 invalid openid list size,at least two openid hint 畢竟是 2....