摘要:關(guān)于本教程有任何建議或者疑問(wèn),都?xì)g迎郵件與我聯(lián)系,或者在上提出教程流程簡(jiǎn)介教程將會(huì)從如何分析微信協(xié)議開(kāi)始,第一部分將教你如何從零開(kāi)始獲取并模擬擴(kuò)展個(gè)人微信號(hào)所需要的協(xié)議。
現(xiàn)在的日常生活已經(jīng)離不開(kāi)微信,難免會(huì)生出微信有沒(méi)有什么API可以使用的想法。
那樣就可以拿自己微信做個(gè)消息聚合、開(kāi)個(gè)投票什么的,可以顯然沒(méi)有這種東西。
不過(guò)還好,有網(wǎng)頁(yè)版微信不就等于有了API么,這個(gè)項(xiàng)目就是出于這個(gè)想法出現(xiàn)的。
目標(biāo)看完這一系列教程,你就能從頭開(kāi)始實(shí)現(xiàn)自己關(guān)于微信以及類(lèi)似工具的想法,例如一個(gè)完善的微信機(jī)器人。
當(dāng)然,如果你只對(duì)使用微信的API感興趣,可以直接跳到下一篇教程,直接使用我已經(jīng)完成的API。
本文為該教程的第一部分,主要講述抓包與偽造,將會(huì)以最簡(jiǎn)單的方法介紹使用Python模擬登陸抓取數(shù)據(jù)等內(nèi)容。
Python與基本的網(wǎng)絡(luò)基礎(chǔ)都不困難,所以即使沒(méi)有這方面基礎(chǔ)輔助搜索引擎也完全可以學(xué)習(xí)本教程。
關(guān)于本教程有任何建議或者疑問(wèn),都?xì)g迎郵件與我聯(lián)系,或者在github上提出(i7meavnktqegm1b@qq.com)
教程流程簡(jiǎn)介教程將會(huì)從如何分析微信協(xié)議開(kāi)始,第一部分將教你如何從零開(kāi)始獲取并模擬擴(kuò)展個(gè)人微信號(hào)所需要的協(xié)議。
第二部分將會(huì)就這些協(xié)議進(jìn)行利用,以微信機(jī)器人為例介紹我給出的項(xiàng)目基本框架與存儲(chǔ)、任務(wù)識(shí)別等功能。
第三部分就項(xiàng)目基本框架開(kāi)發(fā)插件,以消息聚合等功能為例對(duì)框架做進(jìn)一步介紹與擴(kuò)展。
簡(jiǎn)單成果展示:目前的樣例微信號(hào)被擴(kuò)展為了能夠完成信息上傳下載的機(jī)器人,用于展示信息交互功能。
其支持文件、圖片、語(yǔ)音的上傳下載,可以掃碼嘗試使用。
本部分所需環(huán)境本文是這一教程的第一部分,需要配置抓包與Python環(huán)境。
本教程使用的環(huán)境如下:
Windows 8.1
Python 2.7.11 (安裝Image, requests)
Wireshark 2.0.2
微信版本6.3.15
Wireshark配置Wireshark是常見(jiàn)的抓包軟件,這里通過(guò)一些配置抓取微信網(wǎng)頁(yè)端的流量。
由于微信網(wǎng)頁(yè)端使用https,需要特殊的配置才能看到有意義的內(nèi)容,具體的配置見(jiàn)這里。
配置完成以后開(kāi)始抓包,載入https://www.baidu.com后若能看到http請(qǐng)求則配置成功。
分析并模擬掃碼,并獲取登錄狀態(tài)微信網(wǎng)頁(yè)端登陸分為很多步,這里以第一步掃碼為例講解如何從抓包開(kāi)始完成模擬。
分析過(guò)程在抓包以前,我們需要先想清楚這是一個(gè)什么樣的過(guò)程。
我們都登錄過(guò)網(wǎng)頁(yè)端微信,沒(méi)有的話可以現(xiàn)在做一個(gè)嘗試:微信網(wǎng)頁(yè)端。
這個(gè)過(guò)程簡(jiǎn)單而言可以分為如下幾步:
向服務(wù)器提供一些用于獲取二維碼的數(shù)據(jù)
服務(wù)器返回二維碼
向服務(wù)器詢(xún)問(wèn)二維碼掃描狀態(tài)
服務(wù)器返回掃描狀態(tài)
有了這些概念以后就可以開(kāi)始將這四步和包對(duì)應(yīng)起來(lái)。
對(duì)應(yīng)過(guò)程與實(shí)際的包開(kāi)啟wireshark抓包后登陸網(wǎng)頁(yè)端微信,完成掃碼登陸,然后關(guān)閉wireshark抓包。
篩選http請(qǐng)求(就是菜單欄下面輸入的那個(gè)http),可以看到這樣的界面。
這里需要講的就是第一列“No.”列的數(shù)字就是后文說(shuō)的幾號(hào)包,例如第一行就是30號(hào)包。數(shù)據(jù)包的類(lèi)型則在Info列中可以看到,是GET,POST或是別的請(qǐng)求。
那么我們可以開(kāi)始分析抓到的包了,我們先粗略的瀏覽一下數(shù)據(jù)包。
第325號(hào)包引起了我的注意,因?yàn)榈顷戇^(guò)程當(dāng)中非常有特征的一個(gè)過(guò)程是二維碼的獲取,所以我們嘗試打開(kāi)這一數(shù)據(jù)包的圖片的內(nèi)容。
325號(hào)包是由292號(hào)包的請(qǐng)求獲取的,292號(hào)包又是一個(gè)普通的get請(qǐng)求,所以我們嘗試直接在瀏覽器中訪問(wèn)這一網(wǎng)址。(訪問(wèn)自己抓到的網(wǎng)址)
具體的網(wǎng)址通過(guò)雙擊打開(kāi)292號(hào)包即可找到。如需要可以點(diǎn)擊這里看圖。
我們發(fā)現(xiàn)直接在瀏覽器中獲取了一張二維碼,所以這很有可能就是上述一、二步的過(guò)程了。
那么我們是向服務(wù)器提供了哪些數(shù)據(jù)獲取了二維碼呢?
每次我們登錄的二維碼會(huì)變化,且沒(méi)有隨二維碼傳回的標(biāo)識(shí),所以我們肯定提供了每次不同的信息
網(wǎng)址中最后一部分看起來(lái)比較像標(biāo)識(shí):https://login.weixin.qq.com/qrcode/4ZtmDT6OPg==
為了進(jìn)一步驗(yàn)證猜想,再次抓包,發(fā)現(xiàn)類(lèi)似292號(hào)包的請(qǐng)求url僅最后一部分存在區(qū)別
所以我們提供了4ZtmDT6Opg==獲取到了這一二維碼。
那么這一標(biāo)識(shí)是隨機(jī)生成的還是服務(wù)器獲取的呢?
從最近的包開(kāi)始分析服務(wù)器傳回的數(shù)據(jù)(Source是服務(wù)器地址的數(shù)據(jù)),發(fā)現(xiàn)就在上一行,286號(hào)包有我們感興趣的數(shù)據(jù)。
打開(kāi)這個(gè)包,可以看到其返回的數(shù)據(jù)為window.QRLogin.code = 200; window.QRLogin.uuid = "4ZtmDT6OPg==";(見(jiàn)下方截圖)
顯然導(dǎo)致服務(wù)器返回這一請(qǐng)求的284號(hào)包就是我們獲取標(biāo)識(shí)(下稱(chēng)uuid)所需要偽造的包。
那么284號(hào)包需要傳遞給服務(wù)器哪些數(shù)據(jù)?
這是一個(gè)get請(qǐng)求,所以我們分析其請(qǐng)求的url:https://login.weixin.qq.com/jslogin?appid=wx782c26e4c19acffb&redirect_uri=https%3A%2F%2Fwx.qq.com%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxnewloginpage&fun=new&lang=en_US&_=1453725386008。
可以發(fā)現(xiàn)需要給出五個(gè)量appid, redirect_uri, fun, lang, _。
其中除了appid其余都顯然是固定的量(_的格式顯然為時(shí)間戳)。
然而搜索284號(hào)包之前的包也沒(méi)有發(fā)現(xiàn)這一數(shù)值的來(lái)源,所以暫且認(rèn)為其也是固定的量,模擬時(shí)如果出現(xiàn)問(wèn)題再做嘗試。
到了這里,1,2步的過(guò)程我們已經(jīng)能夠?qū)?yīng)上相應(yīng)的包了。
3,4部的最顯著特征是在掃描成功以后會(huì)獲取掃描用的微信號(hào)的頭像。
我們還是首先大致的瀏覽一下服務(wù)器返回的數(shù)據(jù)包,試圖找到包含圖片的數(shù)據(jù)包。
從325號(hào)包(微信頭像肯定在二維碼之后獲取)開(kāi)始瀏覽。
我們發(fā)現(xiàn)338號(hào)包中包含一個(gè)base64加密的圖片,解壓后可以看到自己的頭像。
所以這個(gè)數(shù)據(jù)包就是服務(wù)器返回的掃描成功的數(shù)據(jù)包了,而前面那部分window.code=201顯然就是表示狀態(tài)的代碼。(見(jiàn)下方截圖)
經(jīng)過(guò)嘗試與再次抓包,我們理解狀態(tài)碼的涵義:200:登陸成功 201:掃描成功 408:圖片過(guò)期
那么第四部我們已經(jīng)能夠完全的理解
我們很容易的找到了在登錄過(guò)程當(dāng)中不斷出現(xiàn)的請(qǐng)求,那么要怎么模擬呢?
首先這是一個(gè)簡(jiǎn)單的get請(qǐng)求,url為:https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=4ZtmDT6OPg==&tip=1&r=-2026440414&_=1453725386009
可以發(fā)現(xiàn)需要給出五個(gè)量loginicon, uuid, tip, r, _
通過(guò)多次抓包發(fā)現(xiàn)除了r以外都可以找到簡(jiǎn)單的規(guī)律,那么r的規(guī)律等待模擬時(shí)再?lài)L試處理
至此你應(yīng)該已經(jīng)能將四個(gè)過(guò)程全部與具體的數(shù)據(jù)包對(duì)應(yīng)。為了避免有遺漏的過(guò)程,我們將沒(méi)有使用到的與服務(wù)器交互的數(shù)據(jù)包標(biāo)識(shí)出來(lái)(右鍵Mark)。經(jīng)過(guò)簡(jiǎn)單的瀏覽,認(rèn)為其中并沒(méi)有必須的數(shù)據(jù)包交互。但值得注意的是,如果之后模擬數(shù)據(jù)包沒(méi)有問(wèn)題卻無(wú)法登陸的話應(yīng)當(dāng)再回到這些數(shù)據(jù)包中搜尋。
這里做一個(gè)簡(jiǎn)單的小結(jié),這一部分簡(jiǎn)單的介紹了分析數(shù)據(jù)包的基本思路,以及一些小的技巧。當(dāng)然這些僅供參考,在具體的抓包中完全可以根據(jù)具體的交互過(guò)程自由發(fā)揮。而目前留下來(lái)的問(wèn)題有:第一步時(shí)的appid與第三步時(shí)的r,留待模擬時(shí)在做研究。
使用Python模擬掃碼這一部分我們使用python的requests模塊,可以通過(guò)pip install requests安裝。
我們先來(lái)簡(jiǎn)單的講述一下這個(gè)包。
import requests # 新建一個(gè)session對(duì)象(就像開(kāi)了一個(gè)瀏覽器一樣) session = requests.Session() # 使用get方法獲取https://www.baidu.com/s?wd=python url = "https://www.baidu.com/s" params = { "wd": "python", } r = session.get(url = url, params = params) with open("baidu.htm") as f: f.write(r.content) # 存入文件,可以使用瀏覽器嘗試打開(kāi) # 舉例使用post方法 import json url = "https://www.baidu.com" data = { "wd": "python", } r = session.get(url = url, data = json.dumps(data)) with open("baidu.htm") as f: f.write(r.content) # 以上代碼與下面的代碼不連續(xù)
如果想要更多的了解這個(gè)包,可以瀏覽requests快速入門(mén)。
你可以嘗試獲取一個(gè)你熟悉的網(wǎng)站來(lái)測(cè)試使用requests,在測(cè)試時(shí)可以打開(kāi)抓包,查看你發(fā)送的數(shù)據(jù)包與想要發(fā)送的數(shù)據(jù)包是否一樣。
那么我們開(kāi)始模擬第一、二個(gè)過(guò)程,向服務(wù)器提供一些用于獲取二維碼的數(shù)據(jù),服務(wù)器返回二維碼。
向服務(wù)器提交284,292號(hào)包
從服務(wù)器返回?cái)?shù)據(jù)中提取出uuid與二維碼圖片
284號(hào)包
我們需要模擬的地址為:https://login.weixin.qq.com/jslogin?appid=wx782c26e4c19acffb&redirect_uri=https%3A%2F%2Fwx.qq.com%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxnewloginpage&fun=new&lang=en_US&_=1453725386008 ,所以我們模擬的代碼如下:
#coding=utf8 import time, requests session = requests.Session() url = "https://login.weixin.qq.com/jslogin" params = { "appid": "wx782c26e4c19acffb", "redirect_uri": "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage", "fun": "new", "lang": "en_US", "_": int(time.time()), } r = session.get(url, params = params) print("Content: %s"%r.text)
當(dāng)然,將模擬的地址全部寫(xiě)在url里面效果完全一樣。
值得一提的是requests會(huì)幫我們自動(dòng)urlencode,如果不需要urlencode(/變?yōu)榱?2F)可以將所有內(nèi)容都寫(xiě)在url里面。
提取出uuid
這里使用re,如果不了解正則表達(dá)式的話可以直接拿來(lái)用,畢竟和這一個(gè)教程并不相關(guān)。
# 上接上一段程序 import re regx = r"window.QRLogin.code = (d+); window.QRLogin.uuid = "(S+?)";" # 我們可以看到返回的量是上述的格式,括號(hào)內(nèi)的內(nèi)容被提取了出來(lái) data = re.search(regx, r.text) if data and data.group(1) == "200": uuid = data.group(2) print("uuid: %s"%uuid)
如果沒(méi)能成功獲取到uuid可以嘗試再運(yùn)行一次。
292號(hào)包
我們需要模擬的url為:https://login.weixin.qq.com/qrcode/4ZtmDT6OPg== ,所以我們模擬的代碼如下:
# 上接上一段程序 url = "https://login.weixin.qq.com/qrcode/" + uuid r = session.get(url, stream = True) with open("QRCode.jpg", "wb") as f: f.write(r.content) # 現(xiàn)在你可以在你存儲(chǔ)代碼的位置發(fā)現(xiàn)一張存下來(lái)的圖片,用下面的代碼打開(kāi)它 import platform, os, subprocess if platform.system() == "Darwin": subprocess.call(["open", "QRCode.jpg"]) elif platform.system() == "Linux": subprocess.call(["xdg-open", "QRCode.jpg"]) else: os.startfile("QR.jpg")
由于我們需要獲取圖像,所以需要以二進(jìn)制數(shù)據(jù)流的形式獲取服務(wù)器返回的數(shù)據(jù)包,所以增加stream = True。
而將二進(jìn)制數(shù)據(jù)流寫(xiě)入也需要在打開(kāi)文件時(shí)設(shè)定二進(jìn)制寫(xiě)入,即open("QRCode.jpg", "wb")。
當(dāng)然,如果獲取失敗可以再運(yùn)行一次。
同理的三、四步也可以按照這個(gè)方法寫(xiě)出,這里就不再贅述,只給出代碼。
而經(jīng)過(guò)測(cè)試我們發(fā)現(xiàn),第一步時(shí)的appid實(shí)際是一個(gè)固定的量,第三步時(shí)的r甚至不輸入也可以登錄。
# 上接上一段代碼 import time while 1: url = "https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login" # 這里演示一下不使用自帶的urlencode params = "tip=1&uuid=%s&_=%s"%(uuid, int(time.time())) r = session.get(url, params = params) regx = r"window.code=(d+)" data = re.search(regx, r.text) if not data: continue if data.group(1) == "200": # 下面一段是為了之后獲取登錄信息做準(zhǔn)備 uriRegex = r"window.redirect_uri="(S+)";" redirectUri = re.search(uriRegex, r.text).group(1) r = session.get(redirectUri, allow_redirects=False) redirectUri = redirectUri[:redirectUri.rfind("/")] baseRequestText = r.text break elif data.group(1) == "201": print("You have scanned the QRCode") time.sleep(1) elif data.group(1) == "408": raise Exception("QRCode should be renewed") print("Login successfully")
當(dāng)你看到Login successfully時(shí),說(shuō)明至此我們已經(jīng)成功從零開(kāi)始,通過(guò)抓包分析,用python成功模擬了python登陸。
不過(guò)是不是看上去沒(méi)有什么反饋呢?那是因?yàn)槲覀冞€沒(méi)有模擬會(huì)產(chǎn)生反饋的包,但其實(shí)差的只是研究發(fā)文字、發(fā)圖片什么的包了。
為了體現(xiàn)我們已經(jīng)登陸了,加上后面這段代碼就可以看到登陸的賬號(hào)信息:
# 上接上一段代碼 import xml.dom.minidom def get_login_info(s): baseRequest = {} for node in xml.dom.minidom.parseString(s).documentElement.childNodes: if node.nodeName == "skey": baseRequest["Skey"] = node.childNodes[0].data.encode("utf8") elif node.nodeName == "wxsid": baseRequest["Sid"] = node.childNodes[0].data.encode("utf8") elif node.nodeName == "wxuin": baseRequest["Uin"] = node.childNodes[0].data.encode("utf8") elif node.nodeName == "pass_ticket": baseRequest["DeviceID"] = node.childNodes[0].data.encode("utf8") return baseRequest baseRequest = get_login_info(baseRequestText) url = "%s/webwxinit?r=%s" % (redirectUri, int(time.time())) data = { "BaseRequest": baseRequest, } headers = { "ContentType": "application/json; charset=UTF-8" } r = session.post(url, data = json.dumps(data), headers = headers) dic = json.loads(r.content.decode("utf-8", "replace")) print("Log in as %s"%dic["User"]["NickName"])
這里做一個(gè)簡(jiǎn)單的小結(jié):
模擬數(shù)據(jù)包總體而言是以尋找未知的必須數(shù)據(jù)為線索,輔助一些技巧,串聯(lián)起整個(gè)過(guò)程。
首先需要用python初始化一個(gè)session,否則登錄過(guò)程的存儲(chǔ)將會(huì)比較麻煩。
模擬數(shù)據(jù)包的時(shí)候首先區(qū)分get與post請(qǐng)求,對(duì)應(yīng)session的get與post方法。
get的數(shù)據(jù)為url后半部分的內(nèi)容,post是數(shù)據(jù)包最后一部分的內(nèi)容。
get方法中傳入數(shù)據(jù)的標(biāo)示為params, post方法中傳入數(shù)據(jù)的標(biāo)示為data。
session的get,post方法返回一個(gè)量,可以通過(guò)r.text自動(dòng)編碼顯示。
存儲(chǔ)圖片有特殊的方式與配置。
小結(jié)到現(xiàn)在為止我展示了一個(gè)完整的抓包、分析、模擬的過(guò)程完成了模擬登陸,其他一些事情其實(shí)也都是類(lèi)似的過(guò)程,想清楚每一步要做些什么即可。
這里用到的軟件都只介紹了最簡(jiǎn)單的一些方法,進(jìn)一步的內(nèi)容這里給出一些建議:
wireshark可以直接瀏覽官方文檔,有空可以做一個(gè)了解。
requests包的使用通過(guò)搜索引擎即可,特殊的功能建議直接閱讀源碼。
那么做一個(gè)小練習(xí)好了,測(cè)試一下學(xué)到的東西:讀取命令行的輸入并發(fā)送給自己。(這部分的源碼放在了文末)
在分析包的過(guò)程中記得抓好位置的必要數(shù)據(jù)這個(gè)線索,練習(xí)之前提到過(guò)的一些技巧。
把大的過(guò)程拆分成一個(gè)一個(gè)小的任務(wù)可能會(huì)讓分析簡(jiǎn)單很多。
如果發(fā)現(xiàn)登錄過(guò)程意料之外的斷了,分析不出原因,可以嘗試多抓幾次包再比較分析。
具體運(yùn)用時(shí)可能遇到的難點(diǎn) 命令行登錄一段時(shí)間后無(wú)法與服務(wù)器正常交互這是因?yàn)槲⑿啪W(wǎng)頁(yè)端存在心跳機(jī)制,一段時(shí)間不交互將會(huì)斷開(kāi)連接。
另外,每次獲取數(shù)據(jù)時(shí)(webwxsync)記得更新SyncKey。
某個(gè)特定請(qǐng)求不知道如何模擬在項(xiàng)目中已經(jīng)模擬好了幾乎所有的請(qǐng)求,你可以通過(guò)參考我的方法與數(shù)據(jù)包。
如果之后微信網(wǎng)頁(yè)版出現(xiàn)更新我會(huì)在本項(xiàng)目中及時(shí)更新。
項(xiàng)目中的微信網(wǎng)頁(yè)端接口見(jiàn)這里
無(wú)法上傳中文文件名的文件與圖片這是因?yàn)槭褂胷equests包會(huì)自動(dòng)將中文文件名編碼為服務(wù)器端無(wú)法識(shí)別的格式,所以需要修改requests包或者使用別的方法上傳文件。
最簡(jiǎn)單的方法即將requests包的packages/urlib3中的fields.py中的format_header_param方法改為如下內(nèi)容:
def format_header_param(name, value): if not any(ch in value for ch in "" "): result = "%s="%s"" % (name, value) try: result.encode("ascii") except UnicodeEncodeError: pass else: return result if not six.PY3: # Python 2: value = value.encode("utf-8") value = email.utils.encode_rfc2231(value, "utf-8") value = "%s="%s"" % (name, value.decode("utf8")) return value登錄時(shí)出現(xiàn)不安全的提示
建議更新Python版本至2.7.11
小練習(xí)答案源碼可在該地址下載:這里
結(jié)束語(yǔ)希望讀完這篇文章能對(duì)你有幫助,有什么不足之處萬(wàn)望指正(鞠躬)。
有什么想法或者想要關(guān)注我的更新,歡迎來(lái)Github上Star或者Fork。
160426
LittleCoder
EOF
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/37974.html
摘要:本文為教程的第二部分,主要以微信控制器群發(fā)助手好友刪除檢測(cè)為例演示如何調(diào)用微信。教程流程簡(jiǎn)介這一系列教程從如何分析微信協(xié)議開(kāi)始,第一部分教你如何從零開(kāi)始獲取并模擬擴(kuò)展個(gè)人微信號(hào)所需要的協(xié)議。 現(xiàn)在的日常生活已經(jīng)離不開(kāi)微信,本文將會(huì)拋磚引玉演示如何使用Python調(diào)用微信API做一些有意思的東西。 看完這一系列教程,你就能從頭開(kāi)始實(shí)現(xiàn)自己關(guān)于微信的想法。 本文為教程的第二部分,主要以微信...
摘要:配置配置使用概率抽樣。采樣率定義了對(duì)跟蹤跨度進(jìn)行采樣的概率,其值可以介于和含之間。例如,以下配置對(duì)象將采樣率更改為即每個(gè)跨度都被采樣,并使用協(xié)議將跟蹤發(fā)送到位于的服務(wù)器文件路徑注將采樣率更改為會(huì)完全禁用跟蹤。目錄手把手教你學(xué)Dapr - 1. .Net開(kāi)發(fā)者的大時(shí)代手把手教你學(xué)Dapr - 2. 必須知道的概念手把手教你學(xué)Dapr - 3. 使用Dapr運(yùn)行第一個(gè).Net程序手把手教你學(xué)Da...
??蘇州程序大白一文從基礎(chǔ)手把手教你Python數(shù)據(jù)可視化大佬??《??記得收藏??》 目錄 ????開(kāi)講啦!!!!????蘇州程序大白?????博主介紹前言數(shù)據(jù)關(guān)系可視化散點(diǎn)圖 Scatter plots折線圖強(qiáng)調(diào)連續(xù)性 Emphasizing continuity with line plots同時(shí)顯示多了圖表 數(shù)據(jù)種類(lèi)的可視化 Plotting with categorical da...
摘要:按著我的步驟一步一步操作,你就可以成功的到這個(gè)微信支付技能包。原文鏈接手把手教你實(shí)現(xiàn)小程序微信支付由于自己本身就是開(kāi)發(fā)的,所以只涉及到微信支付的開(kāi)發(fā)。我將會(huì)一步一步的記錄如何實(shí)現(xiàn)微信支付的。第一步先上微信支付開(kāi)發(fā)文檔境內(nèi)普通商戶(hù)里面下載與。 這是我自己研究了兩天的微信支付整理得的開(kāi)發(fā)筆記,然后在這里分享給大家,讓大家快速上手微信支付。 按著我的步驟一步一步操作,你就可以成功的get到這...
摘要:如何在低成本有限的時(shí)間里策劃一場(chǎng)合格的裂變活動(dòng)呢常做裂變的朋友可能回到個(gè)詞裂變系數(shù)投入與產(chǎn)出比。存在成本的裂變活動(dòng)嗎答案存在。在這條新規(guī)則宣布后,裂變分享率增加到了。優(yōu)點(diǎn)進(jìn)一步驗(yàn)證用戶(hù)的朋友圈,防止渾水摸魚(yú)。 ...
閱讀 2759·2021-09-24 10:34
閱讀 1861·2021-09-22 10:02
閱讀 2251·2021-09-09 09:33
閱讀 1457·2021-08-13 15:02
閱讀 3269·2020-12-03 17:10
閱讀 1179·2019-08-30 15:44
閱讀 2143·2019-08-30 12:58
閱讀 3228·2019-08-26 13:40