在前一篇文章已经知道,接收消息是XML格式
xml图片消息格式
Msgtype有几种类型 文本消息 图片消息 语音消息 视频消息 小视频消息 地理位置消息 (可以用来打卡) 链接消息
点击这里查看微信文档
https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_standard_messages.html
我们再看这里图片消息xml中的picurl,mediaid部分
<PicUrl><![CDATA[this is a url]]></PicUrl>
<MediaId><![CDATA[media_id]]></MediaId>
那下载这个图片就有两个方法了 1 使用picurl来下载 2 根据MediaId用微信临时素材接口下载
cUrl=this.getkeyvalue(MsgText,"PicUrl")
Qiyu_HttpClient =Newobject("Qiyu_HttpClient","Qiyu_HttpClient.prg")
Qiyu_HttpClient.DataType="bin" &&数据类型 string 字符串 bin 二进制流
cReturn= Qiyu_HttpClient.Send(cUrl)
If Isnull(cReturn)
?Qiyu_HttpClient.msg
Else
STRTOFILE(cReturn,SYS(2015)+".jpg")
Endif
我已经将调用api封装成类库了。
cMediaId=This.getkeyvalue(MsgText,"MediaId")
oMedia=This.getMedia(cMediaId) &&返回对象
IF ISNULL(oMedia)
ERROR this.msg
ENDIF
?"文件名",oMedia.filename
Strtofile(oMedia.filedata,oMedia.filename) &&多媒体数据
两个方法有什么区别,一个是压缩过的图,一个是原图。
附上文中的两个过程 ,大家没有框架的,可以按这个思路去实现。有框架的当然就直接用啦。 getkeyvalue过程方法
Procedure getkeyvalue
Lparameters cMsgText,cKey
If Pcount()<2
Error "必须传入两个参数"
Endif
Set Textmerge Delimiters To "{" , "}"
TEXT TO leftchar NOSHOW TEXTMERGE PRETEXT 1+2
<{cKey}><![CDATA[
ENDTEXT
TEXT TO rightchar NOSHOW TEXTMERGE PRETEXT 1+2
]]></{cKey}>
ENDTEXT
Set Textmerge Delimiters
Return Strextract(cMsgText ,leftchar,rightchar,1,1)
Endproc
getMedia过程
获取媒体资源,返回对象(filename 文件名,filedata文件数据)
Procedure getMedia
Lparameters cMEDIA_ID
Local cUrl,lcResult,oFly
TEXT TO curl NOSHOW TEXTMERGE PRETEXT 1+2+4+8
https://api.weixin.qq.com/cgi-bin/media/get?access_token=<<this.token>>&media_id=<<cMEDIA_ID>>
ENDTEXT
Qiyu_HttpClient =Newobject("Qiyu_HttpClient","Qiyu_HttpClient.prg")
Qiyu_HttpClient.DataType="bin" &&数据类型 string 字符串 bin 二进制流
lcResult= Qiyu_HttpClient.Send(cUrl)
If Isnull(lcResult)
This.msg=Qiyu_HttpClient.msg
Return .Null.
Endif
oFly=Createobject("empty")
AddProperty(oFly,"filename",Qiyu_HttpClient.filename)
AddProperty(oFly,"filedata",lcResult)
Return oFly
Endproc