2016-06-23 11:46:51 zhonggaorong 阅读数 15819
  • 微信公众号开发9-公众号JSSDK开发-微信开发php

    微信公众平台开发之公众号JSSDK开发是子恒老师《微信公众平台开发》视频教程的第9部。详细讲解了用php开发微信公众号,对微信公众平台中的JSSDK开发。内容包含用JSSDK获取网络状态,地理位置,分享到朋友圈,QQ,空间设置等等。欢迎反馈,微信/QQ:68183131

    14938 人正在学习 去看看 秦子恒


本文章项目demo地址: https://github.com/zhonggaorong/weixinLoginDemo

微信分享环境搭建参考(包含登录的源码):http://blog.csdn.net/zhonggaorong/article/details/51719050


微信分享前提:

  1.需要成功在微信开发者平台注册了账号, 并取的对应的 appkey appSecret。

        2. 针对iOS9 添加了微信的白名单,以及设置了 scheme url 。 这都可以参照上面的链接,进行设置好。 

  3. 分享不跳转的时候原因总结, 具体方法如下:

             1. 首先检查下是否有向微信注册应用。

       2. 分享参数是否拼接错误。 监听下面 isSuccess  yes为成功, no为是否, 看看是否是分享的对象弄错了。 文本对象与多媒体对象只能选一种。

 BOOL isSuccess = [WXApi sendReq:sentMsg];

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    //向微信注册应用。
    [WXApi registerApp:URL_APPID withDescription:@"wechat"];
    return YES;
}

-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options{
    
    /*! @brief 处理微信通过URL启动App时传递的数据
     *
     * 需要在 application:openURL:sourceApplication:annotation:或者application:handleOpenURL中调用。
     * @param url 微信启动第三方应用时传递过来的URL
     * @param delegate  WXApiDelegate对象,用来接收微信触发的消息。
     * @return 成功返回YES,失败返回NO。
     */
    
    return [WXApi handleOpenURL:url delegate:self];
}


- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
    return [WXApi handleOpenURL:url delegate:self];
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(id)annotation{
    return [WXApi handleOpenURL:url delegate:self];
}


微信分享的核心代码;

#pragma mark 微信好友分享
/**
 *  微信分享对象说明
 *
 *  @param sender 
WXMediaMessage    多媒体内容分享
WXImageObject      多媒体消息中包含的图片数据对象
WXMusicObject      多媒体消息中包含的音乐数据对象
WXVideoObject      多媒体消息中包含的视频数据对象
WXWebpageObject    多媒体消息中包含的网页数据对象
WXAppExtendObject  返回一个WXAppExtendObject对象
WXEmoticonObject   多媒体消息中包含的表情数据对象
WXFileObject       多媒体消息中包含的文件数据对象
WXLocationObject   多媒体消息中包含的地理位置数据对象
WXTextObject       多媒体消息中包含的文本数据对象
 
 */

-(void)isShareToPengyouquan:(BOOL)isPengyouquan{
    /** 标题
     * @note 长度不能超过512字节
     */
    // @property (nonatomic, retain) NSString *title;
    /** 描述内容
     * @note 长度不能超过1K
     */
    //@property (nonatomic, retain) NSString *description;
    /** 缩略图数据
     * @note 大小不能超过32K
     */
    //  @property (nonatomic, retain) NSData   *thumbData;
    /**
     * @note 长度不能超过64字节
     */
    // @property (nonatomic, retain) NSString *mediaTagName;
    /**
     * 多媒体数据对象,可以为WXImageObject,WXMusicObject,WXVideoObject,WXWebpageObject等。
     */
    // @property (nonatomic, retain) id        mediaObject;
    
    /*! @brief 设置消息缩略图的方法
     *
     * @param image 缩略图
     * @note 大小不能超过32K
     */
    //- (void) setThumbImage:(UIImage *)image;
    //缩略图
    UIImage *image = [UIImage imageNamed:@"消息中心 icon"];
    WXMediaMessage *message = [WXMediaMessage message];
    message.title = @"微信分享测试";
    message.description = @"微信分享测试----描述信息";
    //png图片压缩成data的方法,如果是jpg就要用 UIImageJPEGRepresentation
    message.thumbData = UIImagePNGRepresentation(image);
    [message setThumbImage:image];
    

    WXWebpageObject *ext = [WXWebpageObject object];
    ext.webpageUrl = @"http://www.baidu.com";
    message.mediaObject = ext;
    message.mediaTagName = @"ISOFTEN_TAG_JUMP_SHOWRANK";
    
    SendMessageToWXReq *sentMsg = [[SendMessageToWXReq alloc]init];
    sentMsg.message = message;
    sentMsg.bText = NO;
    //选择发送到会话(WXSceneSession)或者朋友圈(WXSceneTimeline)
    if (isPengyouquan) {
        sentMsg.scene = WXSceneTimeline;  //分享到朋友圈
    }else{
        sentMsg.scene =  WXSceneSession;  //分享到会话。
    }
    
    //如果我们想要监听是否成功分享,我们就要去appdelegate里面 找到他的回调方法
    // -(void) onResp:(BaseResp*)resp .我们可以自定义一个代理方法,然后把分享的结果返回回来。
    appdelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    appdelegate.wxDelegate = self;                <span style="font-family: Arial, Helvetica, sans-serif;"> //添加对appdelgate的微信分享的代理</span>
    BOOL isSuccess = [WXApi sendReq:sentMsg];
 
}


完整的代码如下:

appDelegate.h

#import <UIKit/UIKit.h>

@protocol WXDelegate <NSObject>

-(void)loginSuccessByCode:(NSString *)code;
-(void)shareSuccessByCode:(int) code;
@end

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (nonatomic, weak) id<WXDelegate> wxDelegate;
@end


appDelegate.m

#import "AppDelegate.h"
#import "WXApi.h"

//微信开发者ID
#define URL_APPID @"app id"




@interface AppDelegate ()<WXApiDelegate>


@end



@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    //向微信注册应用。
    [WXApi registerApp:URL_APPID withDescription:@"wechat"];
    return YES;
}

-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options{
    
    /*! @brief 处理微信通过URL启动App时传递的数据
     *
     * 需要在 application:openURL:sourceApplication:annotation:或者application:handleOpenURL中调用。
     * @param url 微信启动第三方应用时传递过来的URL
     * @param delegate  WXApiDelegate对象,用来接收微信触发的消息。
     * @return 成功返回YES,失败返回NO。
     */
    
    return [WXApi handleOpenURL:url delegate:self];
}


- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
    return [WXApi handleOpenURL:url delegate:self];
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(id)annotation{
    return [WXApi handleOpenURL:url delegate:self];
}

/*! 微信回调,不管是登录还是分享成功与否,都是走这个方法 @brief 发送一个sendReq后,收到微信的回应
 *
 * 收到一个来自微信的处理结果。调用一次sendReq后会收到onResp。
 * 可能收到的处理结果有SendMessageToWXResp、SendAuthResp等。
 * @param resp具体的回应内容,是自动释放的
 */
-(void) onResp:(BaseResp*)resp{
    NSLog(@"resp %d",resp.errCode);
    
    /*
    enum  WXErrCode {
        WXSuccess           = 0,    成功
        WXErrCodeCommon     = -1,  普通错误类型
        WXErrCodeUserCancel = -2,    用户点击取消并返回
        WXErrCodeSentFail   = -3,   发送失败
        WXErrCodeAuthDeny   = -4,    授权失败
        WXErrCodeUnsupport  = -5,   微信不支持
    };
    */
    if ([resp isKindOfClass:[SendAuthResp class]]) {   //授权登录的类。
        if (resp.errCode == 0) {  //成功。
            //这里处理回调的方法 。 通过代理吧对应的登录消息传送过去。
            if ([_wxDelegate respondsToSelector:@selector(loginSuccessByCode:)]) {
                SendAuthResp *resp2 = (SendAuthResp *)resp;
                [_wxDelegate loginSuccessByCode:resp2.code];
            }
        }else{ //失败
            NSLog(@"error %@",resp.errStr);
            UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"登录失败" message:[NSString stringWithFormat:@"reason : %@",resp.errStr] delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
            [alert show];
        }
    }
    
    if ([resp isKindOfClass:[SendMessageToWXResp class]]) { //微信分享 微信回应给第三方应用程序的类
        SendMessageToWXResp *response = (SendMessageToWXResp *)resp;
        NSLog(@"error code %d  error msg %@  lang %@   country %@",response.errCode,response.errStr,response.lang,response.country);
        
        if (resp.errCode == 0) {  //成功。
            //这里处理回调的方法 。 通过代理吧对应的登录消息传送过去。
            if (_wxDelegate) {
                if([_wxDelegate respondsToSelector:@selector(shareSuccessByCode:)]){
                    [_wxDelegate shareSuccessByCode:response.errCode];
                }
            }
        }else{ //失败
            NSLog(@"error %@",resp.errStr);
            UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"分享失败" message:[NSString stringWithFormat:@"reason : %@",resp.errStr] delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
            [alert show];
        }
    }
} @end


ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController


@end


ViewController.m

#import "ViewController.h"
#import "WXApi.h"
#import "AppDelegate.h"
//微信开发者ID
#define URL_APPID @"appid "
#define URL_SECRET @"app secret"
#import "AFNetworking.h"
@interface ViewController ()<WXDelegate>
{
    AppDelegate *appdelegate;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}
#pragma mark 微信登录
- (IBAction)weixinLoginAction:(id)sender {
    
    if ([WXApi isWXAppInstalled]) {
        SendAuthReq *req = [[SendAuthReq alloc]init];
        req.scope = @"snsapi_userinfo";
        req.openID = URL_APPID;
        req.state = @"1245";
        appdelegate = [UIApplication sharedApplication].delegate;
        appdelegate.wxDelegate = self;

        [WXApi sendReq:req];
    }else{
        //把微信登录的按钮隐藏掉。
    }
}
#pragma mark 微信登录回调。
-(void)loginSuccessByCode:(NSString *)code{
    NSLog(@"code %@",code);
    __weak typeof(*&self) weakSelf = self;
    
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.requestSerializer = [AFJSONRequestSerializer serializer];//请求
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];//响应
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html",@"application/json", @"text/json",@"text/plain", nil];
    //通过 appid  secret 认证code . 来发送获取 access_token的请求
    [manager GET:[NSString stringWithFormat:@"https://api.weixin.qq.com/sns/oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=authorization_code",URL_APPID,URL_SECRET,code] parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {
       
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {  //获得access_token,然后根据access_token获取用户信息请求。

        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
        NSLog(@"dic %@",dic);
        
        /*
         access_token	接口调用凭证
         expires_in	access_token接口调用凭证超时时间,单位(秒)
         refresh_token	用户刷新access_token
         openid	授权用户唯一标识
         scope	用户授权的作用域,使用逗号(,)分隔
         unionid	 当且仅当该移动应用已获得该用户的userinfo授权时,才会出现该字段
         */
        NSString* accessToken=[dic valueForKey:@"access_token"];
        NSString* openID=[dic valueForKey:@"openid"];
        [weakSelf requestUserInfoByToken:accessToken andOpenid:openID];
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
     NSLog(@"error %@",error.localizedFailureReason);
    }];
    
}

-(void)requestUserInfoByToken:(NSString *)token andOpenid:(NSString *)openID{
    
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.requestSerializer = [AFJSONRequestSerializer serializer];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    [manager GET:[NSString stringWithFormat:@"https://api.weixin.qq.com/sns/userinfo?access_token=%@&openid=%@",token,openID] parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {
        
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSDictionary *dic = (NSDictionary *)[NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
        //开发人员拿到相关微信用户信息后, 需要与后台对接,进行登录
        NSLog(@"login success dic  ==== %@",dic);
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"error %ld",(long)error.code);
    }];
}

#pragma mark 微信好友分享
/**
 *  微信分享对象说明
 *
 *  @param sender 
WXMediaMessage    多媒体内容分享
WXImageObject      多媒体消息中包含的图片数据对象
WXMusicObject      多媒体消息中包含的音乐数据对象
WXVideoObject      多媒体消息中包含的视频数据对象
WXWebpageObject    多媒体消息中包含的网页数据对象
WXAppExtendObject  返回一个WXAppExtendObject对象
WXEmoticonObject   多媒体消息中包含的表情数据对象
WXFileObject       多媒体消息中包含的文件数据对象
WXLocationObject   多媒体消息中包含的地理位置数据对象
WXTextObject       多媒体消息中包含的文本数据对象
 
 */
- (IBAction)weixinShareAction:(id)sender {
 [self isShareToPengyouquan:NO];
    
}

#pragma mark 微信朋友圈分享
- (IBAction)friendShareAction:(id)sender {
    
    [self isShareToPengyouquan:YES];
}
-(void)isShareToPengyouquan:(BOOL)isPengyouquan{
    /** 标题
     * @note 长度不能超过512字节
     */
    // @property (nonatomic, retain) NSString *title;
    /** 描述内容
     * @note 长度不能超过1K
     */
    //@property (nonatomic, retain) NSString *description;
    /** 缩略图数据
     * @note 大小不能超过32K
     */
    //  @property (nonatomic, retain) NSData   *thumbData;
    /**
     * @note 长度不能超过64字节
     */
    // @property (nonatomic, retain) NSString *mediaTagName;
    /**
     * 多媒体数据对象,可以为WXImageObject,WXMusicObject,WXVideoObject,WXWebpageObject等。
     */
    // @property (nonatomic, retain) id        mediaObject;
    
    /*! @brief 设置消息缩略图的方法
     *
     * @param image 缩略图
     * @note 大小不能超过32K
     */
    //- (void) setThumbImage:(UIImage *)image;
    //缩略图
    UIImage *image = [UIImage imageNamed:@"消息中心 icon"];
    WXMediaMessage *message = [WXMediaMessage message];
    message.title = @"微信分享测试";
    message.description = @"微信分享测试----描述信息";
    //png图片压缩成data的方法,如果是jpg就要用 UIImageJPEGRepresentation
    message.thumbData = UIImagePNGRepresentation(image);
    [message setThumbImage:image];
    

    WXWebpageObject *ext = [WXWebpageObject object];
    ext.webpageUrl = @"http://www.baidu.com";
    message.mediaObject = ext;
    message.mediaTagName = @"ISOFTEN_TAG_JUMP_SHOWRANK";
    
    SendMessageToWXReq *sentMsg = [[SendMessageToWXReq alloc]init];
    sentMsg.message = message;
    sentMsg.bText = NO;
    //选择发送到会话(WXSceneSession)或者朋友圈(WXSceneTimeline)
    if (isPengyouquan) {
        sentMsg.scene = WXSceneTimeline;  //分享到朋友圈
    }else{
        sentMsg.scene =  WXSceneSession;  //分享到会话。
    }
    
    //如果我们想要监听是否成功分享,我们就要去appdelegate里面 找到他的回调方法
    // -(void) onResp:(BaseResp*)resp .我们可以自定义一个代理方法,然后把分享的结果返回回来。
    appdelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    appdelegate.wxDelegate = self;
    BOOL isSuccess = [WXApi sendReq:sentMsg];
    
    
    //添加对appdelgate的微信分享的代理
    
}

#pragma mark 监听微信分享是否成功 delegate
-(void)shareSuccessByCode:(int)code{
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"分享成功" message:[NSString stringWithFormat:@"reason : %d",code] delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
    [alert show];
}



- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end


大功告成

2016-09-29 16:52:43 yu17310133443 阅读数 6673
  • 微信公众号开发9-公众号JSSDK开发-微信开发php

    微信公众平台开发之公众号JSSDK开发是子恒老师《微信公众平台开发》视频教程的第9部。详细讲解了用php开发微信公众号,对微信公众平台中的JSSDK开发。内容包含用JSSDK获取网络状态,地理位置,分享到朋友圈,QQ,空间设置等等。欢迎反馈,微信/QQ:68183131

    14938 人正在学习 去看看 秦子恒
上一篇文章讲了

ionic开发——微信分享准备工作之签名和包名的获取方法http://blog.csdn.net/yu17310133443/article/details/52701417 点击打开链接

这篇文章说明微信分享朋友,朋友圈的实现方法。

1.首先,我们先检测手机是否安装了微信,代码如下:
Wechat.isInstalled(function (installed) {
    alert("Wechat installed: " + (installed ? "Yes" : "No"));
}, function (reason) {
    alert("Failed: " + reason);
});
2.安装了微信之后,我们分享有很多种:

1)分享文字:
Wechat.share({
    text: "分享的文字",
    scene: 0  
}, function () {
    alert("Success");
}, function (reason) {
    alert("Failed: " + reason);
});


PS:scene:0代表的是分享到朋友,0/1/2分别是朋友、朋友圈、个人收藏、也可以用 Wechat.Scene.TIMELINE、Wechat.Scene.SESSION、Wechat.Scene.FAVORITE

2)分享链接:
Wechat.share({
    message: {
        title: "yuhao",
        description: "This is description.",
        thumb: "www/img/mickey.png",
        media: {
            type: Wechat.Type.WEBPAGE,
            webpageUrl: "http://blog.csdn.net/yu17310133443"
        }
    },
    scene: Wechat.Scene.TIMELINE   // share to Timeline
}, function () {
    alert("Success");
}, function (reason) {
    alert("Failed: " + reason);
});
分享链接应该是最常用的,设置好标题,描述,图片,链接 参数就OK了。

下面给大家分享下我自己练习的代码


这是自己封装的一个简单的方法,可以实现分享朋友或者朋友圈的功能。

2019-03-26 10:26:23 MtangEr 阅读数 628
  • 微信公众号开发9-公众号JSSDK开发-微信开发php

    微信公众平台开发之公众号JSSDK开发是子恒老师《微信公众平台开发》视频教程的第9部。详细讲解了用php开发微信公众号,对微信公众平台中的JSSDK开发。内容包含用JSSDK获取网络状态,地理位置,分享到朋友圈,QQ,空间设置等等。欢迎反馈,微信/QQ:68183131

    14938 人正在学习 去看看 秦子恒

微信公众号中经常遇到的问题就是分享链接到微信朋友圈 微信好友一类的需求。
下边走一下需要操作的流程
1.首先再项目中(一般就放到自己的公共文件中引入即可,vue中引入到index.html中)引入微信js 链接。

目前最高版本应该是1.4.0
<script type="text/JavaScript" src="http://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>

2.在对应需要的文件内添加微信分享的方法

sharewxinit: function (title, content, imgUrl, shareUrl) {
     var vm = this;
     var baseUrl = encodeURIComponent(location.href.split('#')[0]);
     var jsApiList = "checkJsApi,onMenuShareAppMessage,onMenuShareTimeline";
     vm.axios.post("/wx/jsapi/jsapiSignature", {
           url: baseUrl,
           debug: false,
           jsApiList: jsApiList
   	 }).then((res) => {
	       var data = res.data.data;
	       console.log(data);
	       wx.config(eval("(" + data + ")"));
     });
    wx.ready(function () {
   		 //分享到朋友圈的
        wx.onMenuShareTimeline({
              title: title,
              link: shareUrl,
              imgUrl: imgUrl,
              success: function () {
                vm.shareShow = false;
          	}
        });
        //分享给朋友的
        wx.onMenuShareAppMessage({
            title: title,
            desc: content,
            link: shareUrl,
            imgUrl: imgUrl,
            type: '',
            dataUrl: '',
            success: function (da2) {
              vm.shareShow = false;
            }
        });
    });
},

3.调用方法

//在方法中需要传入四个参数 第一个是标题,第二个是内容,第三个是 图片logo,第四个是要跳转到的链接(shareurl,自行定义跳转链接)
在这里插入图片描述

如下:
this.sharewxinit("推荐您成为墨林艺术艺术家", "推荐您成为墨林艺术艺术家", "http://image.molinmall.com/agent/logo.png", shareurl);

效果如下:
在这里插入图片描述在这里插入图片描述
一般做到这三部就没有问题了,
需要注意的点:
进入这个页面的时候 需要使用链接跳转。a标签的href这种 或者 window.localtion.href=" "即可。
vue项目中切不可路由跳转。会出现链接跳转的路径不对

还有一个经历分享:
上次用的时候 接收到这样的信息
在这里插入图片描述
在这里插入图片描述
更新1.4.0版本, 而且接口的名称有变,
使用时,我们将版本升级,接口名称更新。但是升级之后,会遇到bug,并不是我们想要的效果。 又不得不将接口名称改回去,但是版本就仍保留了最高的1.4.0
之后如有解决办法之后再来追加更新

2018-12-19 10:09:19 RungBy 阅读数 512
  • 微信公众号开发9-公众号JSSDK开发-微信开发php

    微信公众平台开发之公众号JSSDK开发是子恒老师《微信公众平台开发》视频教程的第9部。详细讲解了用php开发微信公众号,对微信公众平台中的JSSDK开发。内容包含用JSSDK获取网络状态,地理位置,分享到朋友圈,QQ,空间设置等等。欢迎反馈,微信/QQ:68183131

    14938 人正在学习 去看看 秦子恒

微信分享好友+朋友圈

准备工作

资源申请

申请微信开放平台账号 申请自己的AppID
地址
准备开发资源

  • 开发工具包
    android项目,添加依赖库
    2018.12.12最新
    implementation ‘com.tencent.mm.opensdk:wechat-sdk-android-with-mta:5.1.6’
  • 示例代码
  • 必要的签名文件和工具
    准备好自己的签名文件和签名获取工具
    工具下载地址
  • 视觉设计资源
  • WeDemo开源项目

配置AS

  • AndroidManifest.xml 设置
    添加必要的权限支持
<uses-permission android:name="android.permission.INTERNET"/>

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  • 注册到微信
// APP_ID 替换为你的应用从官方网站申请到的合法appID
private static final String APP_ID = "wx88888888";

// IWXAPI 是第三方app和微信通信的openApi接口
private IWXAPI api;

private regToWx() {
    // 通过WXAPIFactory工厂,获取IWXAPI的实例
    api = WXAPIFactory.createWXAPI(this, APP_ID, true);

    // 将应用的appId注册到微信
    api.registerApp(APP_ID);
}
  • 发送请求或响应到微信
    现在,你的程序要发送请求或发送响应到微信终端,可以通过IWXAPI的 sendReq 和 sendResp 两个方法来实现。

boolean sendReq(BaseReq req);

sendReq是第三方app主动发送消息给微信,发送完成之后会切回到第三方app界面。

boolean sendResp(BaseResp resp);

sendResp是微信向第三方app请求数据,第三方app回应数据之后会切回到微信界面。

sendReq的实现示例,如下图所示:

/初始化一个 WXTextObject 对象,填写分享的文本内容
WXTextObject textObj = new WXTextObject();
textObj.text = text;

//用 WXTextObject 对象初始化一个 WXMediaMessage 对象
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = textObj;
msg.description = text;

SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = String.valueOf(System.currentTimeMillis());  //transaction字段用与唯一标示一个请求
req.message = msg;
req.scene = mTargetScene; 

//调用api接口,发送数据到微信
api.sendReq(req);

scene 字段 int类型常量,代表消息发送的目的
文档中给定的常量
分享到对话:
SendMessageToWX.Req.WXSceneSession
分享到朋友圈:
SendMessageToWX.Req.WXSceneTimeline ;
分享到收藏:
SendMessageToWX.Req.WXSceneFavorite

报错 checkArgs fail, thumbData is invalid
原因,WXWebpageObject .userOpenId ,网页缩略图,要求大小在32K以下
原有的方法
Bitmap thumbBmp = BitmapFactory.decodeResource(getResources(), R.drawable.send_music_thumb)
经常超标
自己控制下缩略图大小

Bitmap thumbBmp = Bitmap.createScaledBitmap(getBitmap(context,R.drawable.page_title),120,120,true);
//    由于一部分图像资源是svg,需要对5.0以上的系统做兼容
    private Bitmap getBitmap(Context context,int vectorDrawableId) {
        Bitmap bitmap = null;
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
            Drawable vectorDrawable = context.getDrawable(vectorDrawableId);
            bitmap = Bitmap.createBitmap(vectorDrawable.getIntrinsicWidth(),
                    vectorDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(bitmap);
            vectorDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
            vectorDrawable.draw(canvas);
        } else {
            bitmap = BitmapFactory.decodeResource(context.getResources(), vectorDrawableId,new BitmapFactory.Options());
        }
        return bitmap;
    }
  • 接收微信的请求及返回值
    如果你的程序需要接收微信发送的请求,或者接收发送到微信请求的响应结果,需要下面3步操作:
    1.在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,该类继承自Activity
<activity
    android:name=".wxapi.WXEntryActivity"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.Translucent.NoTitleBar"
    android:exported="true"
    android:taskAffinity="net.sourceforge.simcpux"
    android:launchMode="singleTask">
</activity>

2.实现IWXAPIEventHandler接口,微信发送的请求将回调到onReq方法,发送到微信请求的响应结果将回调到onResp方法
记得在处理完操作后,finish()当前活动
3. 在WXEntryActivity中将接收到的intent及实现了IWXAPIEventHandler接口的对象传递给IWXAPI接口的handleIntent方法
需要在onCreate()和onNewIntent()中实现

@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        api = WXAPIFactory.createWXAPI(this, WEIXIN_APP_ID,false);
//        api.registerApp(WEIXIN_APP_ID);
        api.handleIntent(getIntent(),this);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        api.handleIntent(intent,this);
    }

版本的适配
分享到朋友圈,需要微信4.2版本以上

if (api.getWXAppSupportAPI() >= Build.TIMELINE_SUPPORTED_SDK_INT) {
    //do share
}

另外需要判断是否安装微信
资料来源

/    检查是否安装微信
    public  boolean isWeChatAppInstalled(Context context) {
        if(api.isWXAppInstalled()) {
            return true;
        } else {
            final PackageManager packageManager = context.getPackageManager();// 获取packagemanager
            List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);// 获取所有已安装程序的包信息
            if (pinfo != null) {
                for (int i = 0; i < pinfo.size(); i++) {
                    String pn = pinfo.get(i).packageName;
                    if (pn.equalsIgnoreCase("com.tencent.mm")) {
                        return true;
                    }
                }
            }
            return false;
        }
    }
  • 权限申请
    微信分享需要获取READ_PHONE_STATE权限,由于在6.0以后,该权限为系统敏感权限,需要动态申请
 //          检查读取本机状态的权限
    private void checkPhoneState() {
        int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE);
        if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, 0);
        }
    }
  • 图片资源

好友和朋友圈图标下载地址

备注

6.72微信更新后,分享回调,cancel和success事件变成一个结果
回调方法onResp(BaseResp baseResp) 返回的baseResp.errCode,不会出现BaseResp.ErrCode.ERR_USER_CANCEL,只会返回BaseResp.ErrCode.ERR_OK(0)
微信更新链接

2015-11-21 17:21:59 chenwill3 阅读数 1930
  • 微信公众号开发9-公众号JSSDK开发-微信开发php

    微信公众平台开发之公众号JSSDK开发是子恒老师《微信公众平台开发》视频教程的第9部。详细讲解了用php开发微信公众号,对微信公众平台中的JSSDK开发。内容包含用JSSDK获取网络状态,地理位置,分享到朋友圈,QQ,空间设置等等。欢迎反馈,微信/QQ:68183131

    14938 人正在学习 去看看 秦子恒

上次写了一篇微信支付的文章,倒也还行就是逻辑上面有点欠妥当,这次针对这个问题我用struts2写了一套用于微信验证并能处理各种消息以及H5支付的一套程序,也针对分享到朋友圈这个功能使用了微信的jssdk,感触特别深,废话不多说下面就开始分享我的心得


一   微信如何和struts2整合

针对这个问题,网上基本没有这方面的资料,因此本人也就特别想针对这方面写篇博客,网上没资料其实道理很简单,首先java开发微信应用本身就比较少,市场都被php占领了;还有就是struts2的原因,目前市面上大家熟知的springmvc大大的挤压了struts的空间。所以.......


1  struts2整合微信的注意事项

struts2本身其实就是一个控制器,微信开发首先就是服务器配置那个部分的验证(使用GET请求)以及各种常用消息的接收和回复(POST)请求,因此只需在struts2里写方法暴露给微信服务器访问就OK,这个方法只要区分出GET和POST两种请求就行,GET请求就调用微信验证的相应方法,POST请求就调用消息处理的方法。这样就搞定了,来看下我的方法

package com.debug.weixin.action;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;

import com.debug.weixin.service.CoreService;
import com.debug.weixin.util.MessageUtil;
import com.debug.weixin.util.SignUtil;
import com.opensymphony.xwork2.ActionContext;

public class WeixinAction {

	

	public void execute() {
		HttpServletRequest request = ServletActionContext.getRequest();
		HttpServletResponse response = ServletActionContext.getResponse();
		// 判断请求方法是get还是post
		String method = request.getMethod().trim();
		if ("get".equalsIgnoreCase(method)) {
			wxCheck(request, response);
		} else if ("post".equalsIgnoreCase(method)) {
			try {
				processRequest(request, response);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	public void wxCheck(HttpServletRequest request, HttpServletResponse response) {
		// 微信加密签名
		String signature = request.getParameter("signature");
		// 时间戳
		String timestamp = request.getParameter("timestamp");
		// 随机数
		String nonce = request.getParameter("nonce");
		// 随机字符串
		String echostr = request.getParameter("echostr");

		PrintWriter out = null;
		try {
			out = response.getWriter();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
		if (SignUtil.checkSignature(signature, timestamp, nonce)) {
			out.print(echostr);
		}
		out.close();
		out = null;
	}
	
	public void processRequest(HttpServletRequest request, HttpServletResponse response) throws Exception{
		
		    request.setCharacterEncoding("UTF-8");  
	        response.setCharacterEncoding("UTF-8");  
	        
	        String encryptType = request.getParameter("encrypt_type");  
	        // 微信加密签名  
	        String signature = request.getParameter("signature");  
	        // 时间戳  
	        String timestamp = request.getParameter("timestamp"); 
	        // 随机数  
	        String nonce = request.getParameter("nonce");  
	        // 响应消息  
	       
	        try{
	        	PrintWriter out = response.getWriter(); 
	        	if (SignUtil.checkSignature(signature, timestamp, nonce)) {  
	        		Map<String, String> requestMap = null;  
	        		if("aes".equals(encryptType)){
	        			requestMap=MessageUtil.parseXmlCrypt(request);
	        			String respXml=CoreService.processRequest(requestMap); 
	        			respXml=MessageUtil.getWxCrypt().encryptMsg(respXml,timestamp,nonce);
	        			//System.out.println(respXml);
	        			out.print(respXml);  
	                }else{
	                	requestMap=MessageUtil.parseXml(request);
	        			String respXml=CoreService.processRequest(requestMap); 
	        			//respXml=MessageUtil.getWxCrypt().encryptMsg(respXml,timestamp,nonce);
	        			out.print(respXml);
	        			//System.out.println(respXml);
	                }
	          
	                // 调用核心业务类接收消息、处理消息  
	                //String respMessage = CoreService.processRequest(request);  
	                
	                
	                out.close();  
	            }  
	        	
	        }catch(Exception e){
	        	e.printStackTrace();
	        }
	        
		}

	
}

这个action还支持密文消息模式,下面就是struts的配置文件了:


<package name="weixin" namespace="/" extends="struts-default">     
        <action name="weixin" class="com.debug.weixin.action.WeixinAction">  
           
        </action>  
 </package>  


对,你没有看错就是这么的简单。只要肯研究微信开发者文档,没什么事写不出来的


二   struts2版微信实现H5支付

微信H5支付其实是3种支付方式之中,最简单的一种,难点是取得openId和生成微信支付签名2个部分,下面我拆分开来说一下


为了简化操作我写了一个表单,只需填写订单号,提交之后取得openId之后直接调用统一下单接口跳转到支付确认界面


<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>提交订单</title>
	<meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
    <meta name="description" content="admin-themes-lab">
    <meta name="author" content="themes-lab">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
  </head>
  
  <body>
      <form action="order/order_payConfirm.action" method="POST">
                  订单号:<input name="orderNo" id="orderNo" value="HK2015012315"/><br/>
       <input type="submit" value="提交订单"/>
      </form>
  </body>
</html>

接下来是Action里的代码

package com.debug.weixin.action;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONObject;

import org.apache.struts2.ServletActionContext;

import com.debug.weixin.pojo.WeixinOauth2Token;
import com.debug.weixin.util.AdvancedUtil;
import com.debug.weixin.util.CommonUtil;
import com.debug.weixin.util.ConfigUtil;
import com.debug.weixin.util.PayCommonUtil;
import com.debug.weixin.util.XMLUtil;

public class OrderAction extends BaseAction{
	
  public String orderIndex(){
		//HttpServletRequest request = ServletActionContext.getRequest();
		//HttpServletResponse response = ServletActionContext.getResponse();
	  return "orderIndex";
  }
  
  public void payConfirm() throws Exception{
		HttpServletRequest request = ServletActionContext.getRequest();
		HttpServletResponse response = ServletActionContext.getResponse();
		String orderNo=request.getParameter("orderNo");
		response.sendRedirect(initOpenId("http://chenwill3.imwork.net/StrutsWX/order/order_h5Pay.action?orderNo="+orderNo));
  }
  public void paySuccess() throws Exception{
	  HttpServletRequest request = ServletActionContext.getRequest();
	  HttpServletResponse response = ServletActionContext.getResponse();
		//这里处理订单
	  InputStream inStream = request.getInputStream();
      ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
      byte[] buffer = new byte[1024];
      int len = 0;
      while ((len = inStream.read(buffer)) != -1) {
          outSteam.write(buffer, 0, len);
      }
     
      outSteam.close();
      inStream.close();
      String result  = new String(outSteam.toByteArray(),"utf-8");//获取微信调用我们notify_url的返回信息
      Map<Object, Object> map = XMLUtil.doXMLParse(result);
      for(Object keyValue : map.keySet()){
          System.out.println(keyValue+"="+map.get(keyValue));
      }
      if (map.get("result_code").toString().equalsIgnoreCase("SUCCESS")) {
          
      	String orderNo=map.get("out_trade_no").toString();
      
			
      	
          response.getWriter().write(PayCommonUtil.setXML("SUCCESS", ""));   //告诉微信服务器,我收到信息了,不要在调用回调action了
          System.out.println("-------------"+PayCommonUtil.setXML("SUCCESS", ""));
      }
		
 }
  public String h5Pay() throws Exception{
	  
	   HttpServletRequest request = ServletActionContext.getRequest();
	   HttpServletResponse response = ServletActionContext.getResponse();
	 
       String orderNo=request.getParameter("orderNo");
		
       String code=request.getParameter("code");
       WeixinOauth2Token token=AdvancedUtil.getOauth2AccessToken(ConfigUtil.APPID, ConfigUtil.APP_SECRECT, code);
   
		
		
		SortedMap<Object, Object> parameters = new TreeMap<Object, Object>();
		parameters.put("appid", ConfigUtil.APPID);

		parameters.put("mch_id", ConfigUtil.MCH_ID);
		parameters.put("device_info", "1000");  
		parameters.put("body", "测试支付订单");
		parameters.put("nonce_str", PayCommonUtil.CreateNoncestr());
		
			 
		parameters.put("out_trade_no", orderNo);
		//parameters.put("total_fee", String.valueOf(combo.getPrice()*100));
		parameters.put("total_fee", "1");
		parameters.put("spbill_create_ip", request.getRemoteAddr());
		parameters.put("notify_url", ConfigUtil.NOTIFY_URL);
		parameters.put("trade_type", "JSAPI");
		parameters.put("openid", token.getOpenId());

		String sign = PayCommonUtil.createSign("UTF-8", parameters);
		//System.out.println("我 的签名是:"+sign);  
		parameters.put("sign", sign);

		String requestXML = PayCommonUtil.getRequestXml(parameters);

		String result = CommonUtil.httpsRequestForString(ConfigUtil.UNIFIED_ORDER_URL,"POST", requestXML);
		System.out.println("----------------------------------");
		System.out.println(result);
		System.out.println("----------------------------------");
	
		
		String m=getH5PayStr(result,request);
		
		
		request.setAttribute("h5Info", m);
		
		
	
		

		return "wxPay";

  }
}

这个Action里最主要的方法是payConfirm和paySuccess,payConfirm调用之后会跳转到h5Pay这个方法,之后调用统一下单接口,调用之后进入支付确认界面,该界面的jsp代码如下

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>H5订单支付</title>
    
	<meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
    <meta name="description" content="admin-themes-lab">
    <meta name="author" content="themes-lab">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  <script type="text/javascript">
	
	function jsApiCall(){
		WeixinJSBridge.invoke(
			'getBrandWCPayRequest',${h5Info}, function(res){
				WeixinJSBridge.log(res.err_msg);
				//alert(res.err_code+res.err_desc+res.err_msg);
				if(res.err_msg == "get_brand_wcpay_request:ok" ) {  
				   alert("恭喜你,购买成功!");
				  
                }else{  
                  
                  alert("支付失败了,请联系商户!");
                                     
                }  
			}
		);
	}

	function callpay(){
		if (typeof WeixinJSBridge == "undefined"){
		    if( document.addEventListener ){
		        document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
		    }else if (document.attachEvent){
		        document.attachEvent('WeixinJSBridgeReady', jsApiCall); 
		        document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
		    }
		}else{
		    jsApiCall();
		}
	}
	</script>
  <body>
    <input type="button" value="确认支付" onclick="callpay()"/>
  </body>
</html>

这样支付流程就走通了,下面贴出BaseAction的2个主要方法:

public String initOpenId(String destUrl) throws Exception {
        
	String re = URLEncoder.encode(destUrl, "UTF-8");
		
        String url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";
        url = url.replace("APPID", ConfigUtil.APPID);
	url = url.replace("REDIRECT_URI", re);
        return url;
   }
  
  
  
  public String getH5PayStr(String result,HttpServletRequest request) throws Exception{
	  	
	  	Map<String, String> map = XMLUtil.doXMLParse(result);
			
			
		  SortedMap<Object,Object> params = new TreeMap<Object,Object>();
	      params.put("appId", ConfigUtil.APPID);
	      params.put("timeStamp", Long.toString(new Date().getTime()));
	      params.put("nonceStr", PayCommonUtil.CreateNoncestr());
	      params.put("package", "prepay_id="+map.get("prepay_id"));
	      params.put("signType", ConfigUtil.SIGN_TYPE);
	      String paySign =  PayCommonUtil.createSign("UTF-8", params);
	      params.put("packageValue", "prepay_id="+map.get("prepay_id"));    //这里用packageValue是预防package是关键字在js获取值出错
	      params.put("paySign", paySign);                                                          //paySign的生成规则和Sign的生成规则一致
	      params.put("sendUrl", ConfigUtil.SUCCESS_URL);                               //付款成功后跳转的页面
	      String userAgent = request.getHeader("user-agent");
	      char agent = userAgent.charAt(userAgent.indexOf("MicroMessenger")+15);
	      params.put("agent", new String(new char[]{agent}));//微信版本号,用于前面提到的判断用户手机微信的版本是否是5.0以上版本。
	      String json = JSONObject.fromObject(params).toString();
	      
	      return json;
	  }


第一个方法是按照获取openid的API写的方法,这个不解释,理解不了只能去看微信开发文档了;第二个方法是拼接用于H5支付的json串

关于支付来最后看下运行截图:


下面就是支付时的截图



到这里支付相关的代码就完结了


三  分享到朋友圈功能(使用JSSDK)

难点:取得AccessToken、取得JSAPITicket、生成jssdk签名


1  取得jsapiticket

accessToken的获取之前已经写过博客,这里直接进入取得jsapiticket的流程,java代码如下

public static JSAPITicket getJsApiTicket(String accessToken){
		String requestUrl="https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";
		requestUrl=requestUrl.replace("ACCESS_TOKEN", accessToken);
		JSONObject json=CommonUtil.httpsRequest(requestUrl, "GET", null);
		JSAPITicket js=new JSAPITicket();
		js.setTicket(json.getString("ticket"));
		js.setExpires_in(json.getInt("expires_in"));
		return js;
}

有关JSAPITicket方法的代码如下

package com.debug.weixin.pojo;

public class JSAPITicket {
	private String ticket;
	private int expires_in;

	public String getTicket() {
		return ticket;
	}

	public void setTicket(String ticket) {
		this.ticket = ticket;
	}

	public int getExpires_in() {
		return expires_in;
	}

	public void setExpires_in(int expiresIn) {
		expires_in = expiresIn;
	}
}

2 生成jssdk的签名

微信提供了一个生成签名的方法,我这边使用的代码和微信提供的形式上有点差异,但效果是一样的,下面是生成签名的方法


package com.debug.weixin.util;

import java.util.Arrays;
import java.util.UUID;
import java.util.Map;
import java.util.HashMap;
import java.util.Formatter;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;  

public class JSSDKSign {
	public static Map<String, Object> sign(String jsapi_ticket, String url) {
        Map<String, Object> ret = new HashMap<String, Object>();
        String nonce_str = create_nonce_str();
        String timestamp = create_timestamp();
       

        String[] paramArr = new String[] { "jsapi_ticket=" + jsapi_ticket,
                "timestamp=" + timestamp, "noncestr=" + nonce_str, "url=" + url};
        Arrays.sort(paramArr);
        // 将排序后的结果拼接成一个字符串
        String content = paramArr[0].concat("&"+paramArr[1]).concat("&"+paramArr[2])
                .concat("&"+paramArr[3]);
       
        String gensignature = null;
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-1");
            // 对拼接后的字符串进行 sha1 加密
            byte[] digest = md.digest(content.toString().getBytes());
            gensignature = byteToStr(digest);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        

        ret.put("url", url);
        ret.put("jsapi_ticket", jsapi_ticket);
        ret.put("nonceStr", nonce_str);
        ret.put("timestamp", Long.parseLong(timestamp));
        ret.put("signature", gensignature);

        return ret;
    }
	private static String byteToStr(byte[] byteArray) {
	    String strDigest = "";
	    for (int i = 0; i < byteArray.length; i++) {
	        strDigest += byteToHexStr(byteArray[i]);
	    }
	    return strDigest;
	}
	private static String byteToHexStr(byte mByte) {
	    char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a',
	            'b', 'c', 'd', 'e', 'f' };
	    char[] tempArr = new char[2];
	    tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
	    tempArr[1] = Digit[mByte & 0X0F];
	    String s = new String(tempArr);
	    return s;
	}
    private static String byteToHex(final byte[] hash) {
        Formatter formatter = new Formatter();
        for (byte b : hash)
        {
            formatter.format("%02x", b);
        }
        String result = formatter.toString();
        formatter.close();
        return result;
    }

    private static String create_nonce_str() {
        return UUID.randomUUID().toString();
    }

    private static String create_timestamp() {
        return Long.toString(System.currentTimeMillis() / 1000);
    }
}


其实也就是自己加了几个方法,当然了用微信提供的sign方法也是OK的,如果微信自带的有问题,可以用我的


3 展示界面代码如下

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  
    <title>分享到朋友圈</title>
    
	<meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
    <meta name="description" content="admin-themes-lab">
    <meta name="author" content="themes-lab">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
     <script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
      <script type="text/javascript" src="jquery.min.js"></script>
  </head>
  <script type="text/javascript">
  
 $(document).ready(function(){
initPage();
});
function initPage() {
//alert(window.location.href);/***用于获得当前连接url用**/
/***用户点击分享到微信圈后加载接口接口*******/
$.post("jssdk_getJSPara.action",{"url":'http://chenwill3.imwork.net/StrutsWX/jssdk_toSharePage.action'},function(data,status){
 
	wx.config({
	          debug: true,
	          appId: '你的appId',
	          timestamp:Number(data.timestamp),
	          nonceStr:data.nonceStr,
	          signature:data.signature,
	          jsApiList: [
	          'checkJsApi',
	          'onMenuShareTimeline',
	          'hideOptionMenu'
	          ]
	      });
	
	});
	
	
	wx.ready(function(){
	    wx.checkJsApi({
            jsApiList: [
                'onMenuShareTimeline',
            ]
        });
        wx.onMenuShareTimeline({
            title: '互联网之子',
            link: 'http://wx.vland.cc/mobile.php?act=module&rid=406&fromuser=oktsYuHivHXuzdsMeCbWyF7b14UU&name=hllihe&do=sharelihe&weid=7',
            imgUrl: 'http://wx.vland.cc/resource/attachment/images/7/2015/01/fl2Lk2p5o3iOJP3jdp9iPXI9i93iPm.jpg',
            trigger: function (res) {
                alert('用户点击分享到朋友圈');
            },
            success: function (res) {
                alert('已分享');
            },
            cancel: function (res) {
                alert('已取消');
            },
            fail: function (res) {
                alert('wx.onMenuShareTimeline:fail: '+JSON.stringify(res));
            }
        });

    });
 
};
function share(){
      
}
  </script>
  <body>
     <input type="button" value="分享" onclick="share()"/>
  </body>
</html>


值得一提的是开发的时候千万不能想着通过自己界面上的按钮点击,之后调用分享到朋友圈的js,这种做法绝对禁止(只有点微信浏览器右上方的那个选项才能触发)


出现这样的alert说明jssdk配置成功了,为了保险起见一般还要判断下微信浏览器是否支持分享到朋友圈



接下来就是点右上方的分享到朋友圈测功能了



输入内容点发送就OK


最后打开朋友圈就能看到分享的东西了



一般情况下这种场景是用在点分享到朋友圈要分享值得内容的功能,正常情况或没特别定制性要求的应用可能用不到,使用jssdk要注意配置这里:



如果是微信支付要配置网页账号和微信支付开发配置



微信支付开发配置一般如下



android 微信朋友分享,朋友圈分享

博文 来自: menglele1314
没有更多推荐了,返回首页