请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

回复图片失败

老师你好,我感觉我每部都做对了,但是图片在微信客户端就是接受不到。 现在我图文,一般的消息都能成功回复出去,就是5的图不行。输出结果如下图

1
2
3
4
5
6
7
8
9
10
11
12
upload url:https://api.weixin.qq.com/cgi-bin/media/upload?access_token=BOYIN9M57YLPbIgQEwM8M1tvnYfAvlxAVtHlJS-SAvrRoZ0q9TI35GBBA423G_rljKOgWf_64o7mAKSQQDOK_CTcXwzdd4UYZnweDcpC9S8eX0Yc8SQlnk11Zj9inRcCTFWcACAXJA&type=image
upload success:{"statusCode":200,"body":{"type":"image","media_id":"KMCavjDjR2piKM8Hk7QSXkKPLUttNdy1Vk5Dt5rk6u7gk2sWuy61rpHT_bB8mzRH","created_at":1476290700},"headers":{"connection":"close","content-type":"text/plain","date":"Wed, 12 Oct 2016 16:45:00 GMT","content-length":"118"},"request":{"uri":{"protocol":"https:","slashes":true,"auth":null,"host":"api.weixin.qq.com","port":443,"hostname":"api.weixin.qq.com","hash":null,"search":"?access_token=BOYIN9M57YLPbIgQEwM8M1tvnYfAvlxAVtHlJS-SAvrRoZ0q9TI35GBBA423G_rljKOgWf_64o7mAKSQQDOK_CTcXwzdd4UYZnweDcpC9S8eX0Yc8SQlnk11Zj9inRcCTFWcACAXJA&type=image","query":"access_token=BOYIN9M57YLPbIgQEwM8M1tvnYfAvlxAVtHlJS-SAvrRoZ0q9TI35GBBA423G_rljKOgWf_64o7mAKSQQDOK_CTcXwzdd4UYZnweDcpC9S8eX0Yc8SQlnk11Zj9inRcCTFWcACAXJA&type=image","pathname":"/cgi-bin/media/upload","path":"/cgi-bin/media/upload?access_token=BOYIN9M57YLPbIgQEwM8M1tvnYfAvlxAVtHlJS-SAvrRoZ0q9TI35GBBA423G_rljKOgWf_64o7mAKSQQDOK_CTcXwzdd4UYZnweDcpC9S8eX0Yc8SQlnk11Zj9inRcCTFWcACAXJA&type=image","href":"https://api.weixin.qq.com/cgi-bin/media/upload?access_token=BOYIN9M57YLPbIgQEwM8M1tvnYfAvlxAVtHlJS-SAvrRoZ0q9TI35GBBA423G_rljKOgWf_64o7mAKSQQDOK_CTcXwzdd4UYZnweDcpC9S8eX0Yc8SQlnk11Zj9inRcCTFWcACAXJA&type=image"},"method":"Post","headers":{"accept":"application/json","content-type":"multipart/form-data; boundary=--------------------------178037158051642397238963","content-length":443239}}}
here?
reply content:<xml>
<ToUserName><![CDATA[oxk0wvwjhJ-UhGr2CGND-VYrgIt0]]></ToUserName>
<FromUserName><![CDATA[gh_0628f885df72]]></FromUserName>
<CreateTime>1476290700742</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<Image>
<MediaId><![CDATA[KMCavjDjR2piKM8Hk7QSXkKPLUttNdy1Vk5Dt5rk6u7gk2sWuy61rpHT_bB8mzRH]]></MediaId>
</Image>
</xml>

基于以上您可以看到,我上传是图片是成功的,返回的body中也包含了和上传一样的mediaid,并且返回的数据也和微信接口要求的一样。

这边还请您给予指导

下面是wechat.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
'use strict'
 
 
var Promise = require('bluebird');
var request = Promise.promisify(require('request'));
var util = require('../lib/util');
var fs = require('fs');
var prefix = 'https://api.weixin.qq.com/cgi-bin/';
var grant_type = 'client_credential';
 
 
//grant_type=client_credential&appid=APPID&secret=APPSECRET
function Wechat(opts){
    var that = this;
    this.appID = opts.appID;
    this.appsecret = opts.appsecret;
    this.getAccessToken = opts.getAccessToken;
    this.saveAccessToken = opts.saveAccessToken;  
    //初始化的过程中就去把token拿到
    this.fetchAccessToken()
}
 
//取得Access token
Wechat.prototype.fetchAccessToken = function (data){
    var that = this;
    //console.log('fetch this:'+that)
    //先检查有没有合法的token,如果有的话直接返回
   if (this.access_token && this.expires_in){
        if (this.validateAccessToken(this)){
            return Promise.resolve(this.access_token)
        }
    }
 
 
 
    // if(this.validateAccessToken(that)){
    //     console.log('valid')
    //     return  Promise.resolve(that.access_token);
    // }
    //console.log('should valid')
        //get 方法是去读写在本地的token,如果本地的不好使了,那么调用update方法去微信服务器交换
    return that.getAccessToken()
             .then(function(data){
                try{
                    data = JSON.parse(data);
                }
                catch(e){
                    return that.updateAccessToken();
                }
                if(that.validateAccessToken(data)){
                    console.log('data:2'+some)
                    return Promise.resolve(data);
                }
                else{
                    //var some = JSON.stringify(data);
                    //console.log('data:2'+some)
                    return that.updateAccessToken();
                }
            }).then( function(data){
                that.access_token = data.access_token;
                that.expires_in = data.expires_in;
                that.saveAccessToken(data);
                //返回token
                return Promise.resolve(data.access_token);
            })
     
}
 
Wechat.prototype.validateAccessToken = function (data){
    var some = JSON.stringify(data);
    console.log("some"+some);
 
    if(!data || !data.access_token || data.expires_in){
        return false
    }
    console.log("what");
    var access_token = data.access_token;
    var expires_in = data.expires_in;
    var curTime = (new Date().getTime());
    //console.log("time"+curTime);
    //1476293619539
    if(curTime < expires_in){
        return true;
    }else{
        return false;
    }
}
 
//上传材料
Wechat.prototype.uploadMaterial = function (type,filePath){
    var that  = this
    //console.log('this1:'+this)
    console.log('readfile path:'+filePath)
    var formData = {
            media: fs.createReadStream(filePath)  
        }
    return new Promise(function (resolve, reject){
        //console.log('this2:'+this)
         that
        .fetchAccessToken()
        .then(function(data){
            //console.log('that:'+data)
            var method = 'upload';
            var access_token = data;
            var type = type;
 
 
            var url = prefix+'media/'+method+'?'+'access_token='+access_token+'&type='+'image';
            console.log('upload url:'+url);
 
            request({method: 'Post',url: url,formData: formData,json: true })
                .then( function(response){
                //response contains full response of request
                //console.log(response);
                //console.log('request success:'+response.created_at);
 
                var uploadc = JSON.stringify(response)
                console.log('upload success:'+uploadc);
 
                var _data = response;
                //console.log(data);
                if(_data){
                    resolve(_data);
                }else{
                    throw new Error('upload uploadMaterial failed')
                }
            })
            .catch(function(err){
                reject(err);
            })
        })
    })
}
 
 
Wechat.prototype.updateAccessToken = function (){
    //console.log('upade')
    var url = prefix+'token?'+'grant_type='+grant_type+'&appid='+this.appID+'&secret='+this.appsecret;
 
    return new Promise(function (resolve, reject){
 
        request({url:url, json: true }).then( function(response){
            //response contains full response of request
            //console.log(response);
            var data = response;
            var result = {
                access_token:'',
                expires_in:'',
            }
            //console.log(data);
            var curTime = (new Date().getTime());
            var expires_in = curTime + (data.body.expires_in - 20) * 1000;
            result.expires_in = expires_in;
            result.access_token = data.body.access_token;
 
            resolve(result);
        })
    })
}
 
Wechat.prototype.reply = function (){
     
        var content = this.body;
        var message = this.weixinData;
        //提取模板处理数据
        var xml = util.tplM(content, message);
 
        console.log('reply content:'+xml);
 
        this.status = 200 
        this.type ='application/xml'
        this.body = xml
}
 
 
module.exports = Wechat;


我reply里面打印出来了输出消息包,正如你在shell输出里面看到的,消息没问题。

下面是回复的js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
'use strict'
 
//实现微信的依据状况的 -- 消息路由
 
var config = require('../config/config')
var Wechat = require('../wechat/wechat')
 
var wechatApi = new Wechat(config.wechat);
var path = require('path')
 
exports.reply = function *(next){
 
     var message = this.weixinData;
 
     //console.log('message:'+message.Event);   
      //console.log('message event EventKey:'+message.EventKey);   
     if(message.MsgType ==='event'){
       if(message.Event ==='subscribe'){
           if(message.EventKey){
               console.log('扫描二维码而来:'+message.Eventkey+''+message.ticket)
           }
           this.body = '宝贝你好,请输入:1,2,3,4其中之一 ';
       }else if(message.Event ==='unsubscribe'){
               console.log('撒有哪啦');
           this.body ='无情取消关注'
       }else if(message.Event ==='LOCATION'){
           this.body = '你的位置是:'+ message.Latitude+'/'+message.Longtitude+'-'+message.EventKey;
 
       }else if(message.Event ==='CLICK'){
           this.body = '您点击了菜单:'+message.EventKey;
 
       }else if(message.Event ==='SCAN'){
           this.body = '谢谢扫描';
       }
 
     }else if (message.MsgType === 'text') {
           var content = message.Content;
           var reply = '你说的太复杂了:'+message.Content;
 
           if(content ==='1'){
               reply ='陆总你好'
           }else if(content == '2'){
               reply = '陆总你好2'
           }else if(content == '3'){
               reply = '陆总我睡了'
           }
           else if(content == '4'){
               reply = [{
                   title:'电音之王',
                   description:'欢迎来到电音之王的世界',
                   picUrl:'http://img.xiami.net/images/collect/772/72/42220772_1425550553_vLXZ.jpg',
                   url:'www.baidu.com'
               },{
                   title:'你好陆总',
                   description:'欢迎来到电音之王的世界哈哈',
                   picUrl:'http://img.xiami.net/images/collect/772/72/42220772_1425550553_vLXZ.jpg',
                   url:'www.baidu.com'
               }]
           }
           else if(content == '5'){
               //console.log('5+0')
               var newpath = path.join(__dirname,'../config/aimage.jpg')
               var uploadImage = yield wechatApi.uploadMaterial('image',newpath)
               //console.log('5+1')
               //console.log("id:"+show);
               reply = {
                   type: 'image',
                   mediaId: uploadImage.body.media_id
               }
           }
            
           this.body = reply
     }
     //console.log('A')
     yield next
     // console.log('B')
}

再下面是g.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
'use strict'
 
 
var sha1 = require('sha1');
var Promise = require('bluebird');
//var request = Promise.promisify(require('request'));
var Wechat = require('./wechat');
var getRawBody = require('raw-body');
var util = require('../lib/util');
 
module.exports = function(opts, handler){
    //实例化一个和wechat交互的对象
    var wechat = new Wechat(opts);
 
    return function *(next){//这个地方怎么用的还需要继续学习
 
 
        var token = opts.token;
        var signature = this.query.signature;
        var nonce = this.query.nonce;
        var timestamp = this.query.timestamp;
        var echostr = this.query.echostr;
 
        var str = [token,timestamp,nonce].sort().join('')
        var sha = sha1(str)
 
        //判断是否验证成功
 
        if(sha === signature){
            if(this.method === 'GET'){
                this.body = echostr +'';
                //console.log('this is a get method');
            }else if(this.method === 'POST'){
                var data  = yield getRawBody(this.req, {
                    length: this.length,
                    limit: '1mb',
                    encoding:this.charset
                })
                 data = yield util.parseXMLAsync(data);
                // console.log(data);
                 //console.log('data.xml:'+data.xml)
                // console.log('G')
                 data = yield util.formatMessage(data.xml);
                 //console.log(data);
 
                 this.weixinData = data;
 
                 //用外面传进来的weixinhandler处理具体的回复内容
 
                 //这个地方传入 next的目的?
                 //console.log('D')
                 yield handler.reply.call(this, next); 
 
                 wechat.reply.call(this);
                 //解析请求,回复完毕后,处理回复的路由
 
                  
            }
        }else{
            this.body = 'wrong';
        }
    }
 
}


正在回答

插入代码

2回答

Scott 2016-10-13 22:10:57

好神奇,看代码,也没看出毛病。


打印出来的 xml 看着也没问题,但是这个 xml 应该是没有被正确回复给微信公众号,比如再发请求的时候断了,或者是测试公众号服务异常,或者是图片 id 不合法,或者是临时素材上传拿到的 id 服务器识别有问题,好吧,这大概是我能想到的可能性了,你切换到手机 4G 用笔记本连上手机 4G,在测试看看呢

0 回复 有任何疑惑可以回复我~
  • 提问者 oog #1
    老师就像你说的一样。。。可能是测试公众号服务异常了。我刚才连接又可以正常接收图片,昨天晚上,和今天早上都不行。。麻烦老师了
    回复 有任何疑惑可以回复我~ 2016-10-13 22:56:23
  • 提问者 oog #2
    非常感谢!
    回复 有任何疑惑可以回复我~ 2016-10-22 21:37:58
提问者 oog 2016-10-13 01:04:09

对了微信中显示 该公众号暂时无法提供服务,请稍后再试

0 回复 有任何疑惑可以回复我~
  • Scott #1
    把 reply.js 贴出来看下
    回复 有任何疑惑可以回复我~ 2016-10-13 14:54:55
  • 提问者 oog 回复 Scott #2
    老师贴出来了,再原问题中 您看一下
    回复 有任何疑惑可以回复我~ 2016-10-13 15:07:08
  • Scott 回复 提问者 oog #3
    用于回复给接口的,图片,文案等逻辑的 reply 的代码也贴一下
    回复 有任何疑惑可以回复我~ 2016-10-13 16:43:56
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号