iOS 接入微信SDK封裝的工具類HHWeixinSDK(微信登錄,微信好友和朋友圈分享,微信支付(客戶端簽名))

SDK下載

這里是微信官方的SDK下載接入流程文檔

手動集成的話需要添加依賴庫

將SDK文件中包含的 libWeChatSDK.a骗绕,WXApi.h,WXApiObject.h 三個文件添加到你所建的工程中,在Build Phases下面的Link Binary With Libraries項中添加下面所需的依賴庫:

661823-7bc9bc5416528645.png

工程配置屬性

在你的工程文件中選擇Build Setting,在"Other Linker Flags"中加入"-Objc -all_load"

設(shè)置URL Scheme

修改 info.plist 文件 URL types 項中后面的URL Schemes內(nèi)容為"wx+ appid",例如:wx1234567890
(我這里設(shè)置了支付寶,qq,微信,微博,只用到微信的話,就添加微信的就ok)


2EA80578-7343-433E-8803-73E4E826BE11.png

添加URL Schemes白名單

在“Info.plist”中增加一個LSApplicationQueriesSchemes值,設(shè)置為array, 添加微信需要的幾個item:
wechat
weixin

簽名安全問題(這里是客戶端來簽名的)

這里后臺只生成了prepayId提供給我們,簽名是在我們iOS客戶端來簽名的,(為什么呢?因為我們后臺不會生成簽名╮(╯﹏╰)╭),需要微信給我們的AppID,密鑰和商戶號,跟支付寶接入一樣,簽名在客戶端來做是有點(diǎn)安全問題的,具體請參考我封裝的HHAliPaySDK,簽名放在服務(wù)端來做,提供給我們,既方便又安全,但是沒辦法,他做不來,只能我們來做,希望你們后臺人員比較給力.

然后就就可以愉快的寫代碼了

創(chuàng)建了一個繼承于NSObject的 HHWeixinSDK工具類(涉及微信登錄,微信好友和朋友圈分享,微信支付),而且我在其中封裝了一下微信支付時向后臺請求prepayId的方法和處理回調(diào)結(jié)果用到的方法.
ps:這個類中有網(wǎng)絡(luò)請求,HHttpManager是我自己對AFNetworking3.0的二次封裝,感興趣的可以看一看,不感興趣的同學(xué)可以用AFN或者自己的網(wǎng)絡(luò)框架.

.h文件

#import <Foundation/Foundation.h>

@interface HHWeixinSDK : NSObject
/**
 實例化
 */
+(instancetype) shareInstance;

/**
 初始化微信SDK
 */
+(void)initSDK;

/**
 打開其他app的回調(diào)
 */
+(BOOL)handleOpenURL:(NSURL *)url;

/** 
 調(diào)用微信登錄接口 
 */
+(void)sendWeixinLoginRequest;


/** 
 查看微信是否安裝 
 */
+ (BOOL)isWeiXinInstall;

/**
 根據(jù)訂單信息向后臺申請prepayId以調(diào)用微信支付接口
 
 @param userId   用戶登錄app的標(biāo)識id
 @param orderId  訂單號,由后臺提供
 @param account  金額
 */
+ (void)sendWeixinPayRequestWithUserId:(NSString *)userId
                               orderId:(NSString *)orderId
                               account:(NSString *)account;

/**
 分享到微信好友
 
 @param title    分享的文字標(biāo)題
 @param content  分享的文字內(nèi)容
 @param urlStr   分享的圖片URL字符串
 */
+ (void)shareToWeixinFriendWithTitle:(NSString *)title
                             Content:(NSString *)content
                         imageURLStr:(NSString *)urlStr;

/**
 分享到微信朋友圈
 
 @param title    分享的文字標(biāo)題
 @param content  分享的文字內(nèi)容
 @param urlStr   分享的圖片URL字符串
 */
+ (void)shareToWeixinFriendsCircleWithTitle:(NSString *)title
                                    Content:(NSString *)content
                                imageURLStr:(NSString *)urlStr;

@end

.m文件

#import "HHWeixinSDK.h"
#import "WXApi.h"
//MD5加密需要導(dǎo)入的頭文件
#import <CommonCrypto/CommonCrypto.h>

//微信接口
#define Weixin_GetAccessTokenURL    @"https://api.weixin.qq.com/sns/oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=authorization_code"
#define Weixin_isAccessTokenCanUse     @"https://api.weixin.qq.com/sns/auth?access_token=%@&openid=%@"
#define Weixin_UseRefreshToken      @"https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=wx8daa93036f9c7721&grant_type=refresh_token&refresh_token=%@"
#define Weixin_GetUserInformation  @"https://api.weixin.qq.com/sns/userinfo?access_token=%@&openid=%@"


@interface HHWeixinSDK ()<WXApiDelegate>

@end

@implementation HHWeixinSDK

static NSString * safeURL(NSString * origin) {
    return [origin stringByAddingPercentEscapesUsingEncoding:
             NSUTF8StringEncoding];
}

static HHWeixinSDK* _instance = nil;

//單例
+(instancetype) shareInstance{
    static dispatch_once_t onceToken ;
    dispatch_once(&onceToken, ^{
        _instance = [[super allocWithZone:NULL] init] ;
    }) ;
    
    return _instance ;
}

+(id) allocWithZone:(struct _NSZone *)zone{
    return [HHWeixinSDK shareInstance] ;
}

-(id) copyWithZone:(NSZone *)zone{
    return [HHWeixinSDK shareInstance] ;//return _instance;
}

-(id) mutablecopyWithZone:(NSZone *)zone{
    return [HHWeixinSDK shareInstance] ;
}

#pragma mark - 回調(diào)
-(void)onReq:(BaseReq *)req{
    
}

-(void)onResp:(BaseResp *)resp{
    /** 微信登錄 */
    if([resp isKindOfClass:[SendAuthResp class]]){
        if (resp.errCode == 0) {
            [self loginWeixinSuccessWithBaseResp:resp];
        }else{
            //登錄失敗
        }
    }
    
    /** 微信支付 */
    if ([resp isKindOfClass:[PayResp class]]){
        [self handleWeixinPayCallBackResultWithPayResp:resp];
    }
}

+(void)initSDK {
    // 打開微信的登錄
     [WXApi registerApp:Weixin_AppID];
}

+(BOOL)handleOpenURL:(NSURL *)url {
    return [WXApi handleOpenURL:url delegate:[self shareInstance]];
}

+(void)sendWeixinLoginRequest{
    //構(gòu)造SendAuthReq結(jié)構(gòu)體
    SendAuthReq* req =[[SendAuthReq alloc ] init ];
    req.scope = @"snsapi_userinfo" ;
    req.state = @"123" ;
    //第三方向微信終端發(fā)送一個SendAuthReq消息結(jié)構(gòu)
    [WXApi sendReq:req];
}

+ (BOOL)isWeiXinInstall{
    return  [WXApi isWXAppInstalled];
}

#pragma mark - 微信登錄成功獲取token
-(void)loginWeixinSuccessWithBaseResp:(BaseResp *)resp{
    SendAuthResp  *auth = (SendAuthResp*)resp;
    NSString *code = auth.code;
    NSLog(@"code:%@", code);
    //Weixin_AppID和Weixin_AppSecret是微信申請下發(fā)的.
    NSString *str = [NSString stringWithFormat:Weixin_GetAccessTokenURL,Weixin_AppID,Weixin_AppSecret,code];
    [HHttpManager GET:str success:^(id responseObject) {
        NSString *access_token = responseObject[@"access_token"];
        NSString *refresh_token = responseObject[@"refresh_token"];
        NSString *openid = responseObject[@"openid"];
        [self isAccess_tokenCanUseWithAccess_token:access_token openID:openid completionHandler:^(BOOL isCanUse) {
            if (isCanUse) {
                [self getUserInformationWithAccess_token:access_token openID:openid];
            }else{
                [self useRefresh_token:refresh_token];
            }
        }];
        
    } failure:^(NSError * error) {
        NSLog(@"請求失敗--%@",error);
    }];
    
}

#pragma mark - 判斷access_token是否過期
- (void)isAccess_tokenCanUseWithAccess_token:(NSString *)access_token openID:(NSString *)openID completionHandler:(void(^)(BOOL isCanUse))completeHandler{
    NSString *strOfSeeAccess_tokenCanUse = [NSString stringWithFormat:Weixin_isAccessTokenCanUse, access_token,openID];
    
    [HHttpManager GET:strOfSeeAccess_tokenCanUse success:^(id responseObject) {
        if ([responseObject[@"errmsg"] isEqualToString:@"ok"]) {
            completeHandler(YES);
        }else{
            completeHandler(NO);
        }
    } failure:^(NSError * error) {
        NSLog(@"請求失敗--%@",error);
        completeHandler(NO);
    }];
}

#pragma mark - 若過期,使用refresh_token獲取新的access_token
- (void)useRefresh_token:(NSString *)refresh_token{
    NSString *strOfUseRefresh_token = [NSString stringWithFormat:Weixin_UseRefreshToken, refresh_token];
    NSLog(@"%@", strOfUseRefresh_token);

    [HHttpManager GET:strOfUseRefresh_token success:^(id responseObject) {
        NSString *openid = responseObject[@"openid"];
        NSString *access_token = responseObject[@"access_token"];
        NSString *refresh_tokenNew = responseObject[@"refresh_token"];
        [self isAccess_tokenCanUseWithAccess_token:access_token openID:openid completionHandler:^(BOOL isCanUse) {
            if (isCanUse) {
                [self getUserInformationWithAccess_token:access_token openID:openid];
            }else{
                [self useRefresh_token:refresh_tokenNew];
            }
        }];
    } failure:^(NSError * error) {
        NSLog(@"請求失敗--%@",error);
    }];
}

#pragma mark - 若未過期,獲取用戶信息
- (void)getUserInformationWithAccess_token:(NSString *)access_token openID:(NSString *)openID{
    NSString *strOfGetUserInformation = [NSString stringWithFormat:Weixin_GetUserInformation, access_token,openID];
    [HHttpManager GET:strOfGetUserInformation success:^(id responseObject) {
        NSString *nickname = responseObject[@"nickname"];
        NSLog(@"nickname:%@", nickname);
        NSString *headimgurl = responseObject[@"headimgurl"];
        NSLog(@"headimgurl:%@", headimgurl);
                NSNumber *sexnumber = responseObject[@"sex"];
                NSString *sexstr = [NSString stringWithFormat:@"%@",sexnumber];
                NSString *sex;
                if ([sexstr isEqualToString:@"1"]) {
                    sex = @"男";
                }else if ([sexstr isEqualToString:@"2"]){
                    sex = @"女";
                }else{
                    sex = @"未知";
                }
//                NSString *province = responseObject[@"province"];
//                NSString *city = responseObject[@"city"];
//        //用戶統(tǒng)一標(biāo)識。針對一個微信開放平臺帳號下的應(yīng)用,同一用戶的unionid是唯一的。
//                    NSString *unionid = responseObject[@"unionid"];


//獲取到用戶信息后根據(jù)需要保存在本地或上傳到服務(wù)端,用作的用戶信息



    } failure:^(NSError * error) {
        NSLog(@"請求失敗--%@",error);
    }];
}

#pragma mark - 向后臺申請支付請求,獲取prepayId
+ (void)sendWeixinPayRequestWithUserId:(NSString *)userId
                               orderId:(NSString *)orderId
                               account:(NSString *)account{
    NSDictionary *paramDict = @{
                                @"userId":@(userId.integerValue),
                                @"orderId":orderId,
                                @"account":@(account.integerValue)
                                };
    //getWeixinPrepayID:后臺提供,用來向后臺請求prepayId的接口
     [HHttpManager POST:getWeixinPrepayID parameters:paramDict success:^(id responseObject) {
        NSNumber *state = responseObject[@"state"];
        if (state.integerValue == 0) {
            NSString *prepayId = responseObject[@"data"][0][@"prepayId"];
            //獲取prepayId后客戶端生成簽名然后發(fā)送支付請求
            [self weixinPayWithPrepayId:prepayId];
        }else{
            
        }
    } failure:^(NSError * error) {
        NSLog(@"請求失敗--%@",error);
        
    }];
}

#pragma mark - 調(diào)起微信客戶端,申請支付
+ (void)weixinPayWithPrepayId:(NSString *)prepayID{
//正常情況下,這里所有的參數(shù)都是后臺提供給我們,但是我們后臺人員不給力,只能我放在客戶端來做簽名了.希望你們后臺人員比較給力.
    PayReq *request = [[PayReq alloc] init];
    //微信支付分配的商戶號
    request.partnerId = Weixin_PartnerId;
    //后臺給的訂單ID
    request.prepayId= prepayID;
    //微信給的固定值,就這么寫
    request.package = @"Sign=WXPay";
    //32位隨機(jī)字符串
    request.nonceStr= [self get32RandomString];
    //時間戳
    request.timeStamp= [self getCurrentTimestamp].intValue;
    /** 
     *簽名
     
     *Weixin_AppID:微信開放平臺審核通過的應(yīng)用APPID
     *Weixin_AppKey:在微信商戶平臺(pay.weixin.qq.com)-->賬戶設(shè)置-->API安全-->密鑰設(shè)置 里面設(shè)置的微信密鑰
     */
    NSString * signStr = [NSString stringWithFormat:@"appid=%@&noncestr=%@&package=%@&partnerid=%@&prepayid=%@&timestamp=%u&key=%@",Weixin_AppID,request.nonceStr,request.package,request.partnerId,request.prepayId,(unsigned int)request.timeStamp,Weixin_AppKey];
    //將簽名進(jìn)行MD5運(yùn)算并轉(zhuǎn)換為大寫
    request.sign= [self stringFromUpperCaseMD5:signStr];
    //支付請求
    [WXApi sendReq:request];
}

#pragma mark - 微信支付是否成功的回調(diào)
-(void)handleWeixinPayCallBackResultWithPayResp:(BaseResp *)resp{
    PayResp *response=(PayResp *)resp;
    switch(response.errCode){
        case WXSuccess:
            //服務(wù)器端查詢支付通知或查詢API返回的結(jié)果再提示成功
            NSLog(@"支付成功");
            break;
        case WXErrCodeUserCancel:
            NSLog(@"用戶點(diǎn)擊取消并返回");
            break;
            
        default:
            NSLog(@"支付失敗蘑斧,retcode=%d",resp.errCode);
            /**
             WXErrCodeCommon     = -1,   普通錯誤類型
             WXErrCodeUserCancel = -2,   用戶點(diǎn)擊取消并返回
             WXErrCodeSentFail   = -3,   發(fā)送失敗
             WXErrCodeAuthDeny   = -4,   授權(quán)失敗
             WXErrCodeUnsupport  = -5,   微信不支持
             */
            
            
            break;
    }
    
}


#pragma mark - 微信分享
//分享到微信好友
+ (void)shareToWeixinFriendWithTitle:(NSString *)title
                             Content:(NSString *)content
                            imageURLStr:(NSString *)urlStr{
    WXMediaMessage *message = [WXMediaMessage message];
    message.title = title;
    message.description = content;
    
    //縮略圖
    NSData *thumbData = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlStr]];
    UIImage *thumbImage = [UIImage imageWithData:thumbData];
    [message setThumbImage:thumbImage];
    //大圖
    WXWebpageObject *webpageObject = [WXWebpageObject object];
    webpageObject.webpageUrl = urlStr;
    message.mediaObject = webpageObject;
    
    SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
    req.bText = NO;
    req.message = message;
    req.scene = WXSceneSession;
    [WXApi sendReq:req];

}


//分享到朋友圈
+ (void)shareToWeixinFriendsCircleWithTitle:(NSString *)title
                             Content:(NSString *)content
                         imageURLStr:(NSString *)urlStr{
    WXMediaMessage *message = [WXMediaMessage message];
    message.title = title;
    message.description = content;
    
    //縮略圖
    NSData *thumbData = [NSData dataWithContentsOfURL:[NSURL URLWithString:safeURL(urlStr)]];
    UIImage *thumbImage = [UIImage imageWithData:thumbData];
    [message setThumbImage:thumbImage];
    //大圖
    WXWebpageObject *webpageObject = [WXWebpageObject object];
    webpageObject.webpageUrl = safeURL(urlStr);
    message.mediaObject = webpageObject;
    
    SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
    req.bText = NO;
    req.message = message;
    req.scene = WXSceneTimeline;
    [WXApi sendReq:req];
    
}


/** 生成32位隨機(jī)字符串 */
+(NSString *)get32RandomString{
    
    NSString *string = [[NSString alloc]init];
    for (int i = 0; i < 32; i++) {
        int number = arc4random() % 36;
        if (number < 10) {
            int figure = arc4random() % 10;
            NSString *tempString = [NSString stringWithFormat:@"%d", figure];
            string = [string stringByAppendingString:tempString];
        }else {
            int figure = (arc4random() % 26) + 97;
            char character = figure;
            NSString *tempString = [NSString stringWithFormat:@"%c", character];
            string = [string stringByAppendingString:tempString];
        }
    }
    return string;
    
}

//獲取當(dāng)前時間的時間戳
+(NSString*)getCurrentTimestamp{
    NSDate* date = [NSDate dateWithTimeIntervalSinceNow:0];
    NSTimeInterval timestamp=[date timeIntervalSince1970];
    NSString*timeString = [NSString stringWithFormat:@"%0.f", timestamp];
    //    NSLog(@"%@", timeString);
    return timeString;
}

//MD5加密大寫
+ (NSString *)stringFromUpperCaseMD5:(NSString *)sourceString{
    const char *string = sourceString.UTF8String;
    unsigned char bytes[CC_MD5_DIGEST_LENGTH];
    extern unsigned char * CC_MD5(const void *data, CC_LONG len, unsigned char *md);
    CC_MD5(string, (CC_LONG)strlen(string), bytes);
    NSMutableString *md5Str = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH];
    for (NSInteger count = 0; count < CC_MD5_DIGEST_LENGTH; count++) {
        [md5Str appendFormat:@"%02x", bytes[count]];
    }
    return [md5Str uppercaseString];
}


@end

設(shè)置

在AppDelegate.m文件中初始化

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 //微信
    [HHWeixinSDK initSDK];
}

openURL方法中設(shè)置回調(diào)(這里一個是iOS9以下的系統(tǒng)調(diào)用的系統(tǒng)方法和一個是iOS9以上的系統(tǒng)調(diào)用的系統(tǒng)方法,都要設(shè)置)

#pragma mark - OpenURL回調(diào)結(jié)果
//iOS9-
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
    [self handleOpenURLWithURLHost:url];
    return YES;
}
//iOS9和9+
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options{
    [self handleOpenURLWithURLHost:url];
    return YES;
}

- (void)handleOpenURLWithURLHost:(NSURL *)url{
 NSLog(@"url.host:%@", url.host);
   //微信(登錄,支付,分享)
   if ([url.host isEqualToString:@"oauth"]||[url.host isEqualToString:@"pay"]||[url.host isEqualToString:@"platformId=wechat"]) {
        [HHWeixinSDK handleOpenURL:url];
    }


}

調(diào)用

調(diào)用之前需要判斷是否安裝了微信

/** 
 查看微信是否安裝 
 */
+ (BOOL)isWeiXinInstall;

如果上述方法返回YES,直接調(diào)用接口就好,個人喜歡類方法,調(diào)用方便,可根據(jù)喜好自行修改.當(dāng)然,前提是你已經(jīng)取得了微信支付和登錄分享的授權(quán)

/** 
 調(diào)用微信登錄接口 
 */
+(void)sendWeixinLoginRequest;

/**
 根據(jù)訂單信息向后臺申請prepayId以調(diào)用微信支付接口
 
 @param userId   用戶id
 @param orderId  訂單信息
 @param account  金額
 */
+ (void)sendWeixinPayRequestWithUserId:(NSString *)userId
                               orderId:(NSString *)orderId
                               account:(NSString *)account;

/**
 分享到微信好友
 
 @param title    分享的文字標(biāo)題
 @param content  分享的文字內(nèi)容
 @param urlStr   分享的圖片URL字符串
 */
+ (void)shareToWeixinFriendWithTitle:(NSString *)title
                             Content:(NSString *)content
                         imageURLStr:(NSString *)urlStr;

/**
 分享到微信朋友圈
 
 @param title    分享的文字標(biāo)題
 @param content  分享的文字內(nèi)容
 @param urlStr   分享的圖片URL字符串
 */
+ (void)shareToWeixinFriendsCircleWithTitle:(NSString *)title
                                    Content:(NSString *)content
                                imageURLStr:(NSString *)urlStr;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市须眷,隨后出現(xiàn)的幾起案子竖瘾,更是在濱河造成了極大的恐慌,老刑警劉巖柒爸,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件准浴,死亡現(xiàn)場離奇詭異,居然都是意外死亡捎稚,警方通過查閱死者的電腦和手機(jī)乐横,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門求橄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人葡公,你說我怎么就攤上這事罐农。” “怎么了催什?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵涵亏,是天一觀的道長。 經(jīng)常有香客問我蒲凶,道長气筋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任旋圆,我火速辦了婚禮宠默,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘灵巧。我一直安慰自己搀矫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布刻肄。 她就那樣靜靜地躺著瓤球,像睡著了一般。 火紅的嫁衣襯著肌膚如雪敏弃。 梳的紋絲不亂的頭發(fā)上卦羡,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機(jī)與錄音权她,去河邊找鬼虹茶。 笑死逝薪,一個胖子當(dāng)著我的面吹牛隅要,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播董济,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼步清,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了虏肾?” 一聲冷哼從身側(cè)響起廓啊,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎封豪,沒想到半個月后谴轮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吹埠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年第步,在試婚紗的時候發(fā)現(xiàn)自己被綠了疮装。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡粘都,死狀恐怖廓推,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情翩隧,我是刑警寧澤樊展,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站堆生,受9級特大地震影響专缠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜淑仆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一藤肢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧糯景,春花似錦嘁圈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至怠惶,卻和暖如春涨缚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背策治。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工脓魏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人通惫。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓茂翔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親履腋。 傳聞我的和親對象是個殘疾皇子珊燎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)遵湖,斷路器悔政,智...
    卡卡羅2017閱讀 134,629評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,754評論 25 707
  • 今日推薦 經(jīng)常閱讀博客是個好習(xí)慣推薦鴻洋CSDN的博客 微信支付相關(guān)文章 詳細(xì)介紹Android開發(fā)集成微信支付(...
    MrQ_Android閱讀 6,167評論 9 52
  • 實現(xiàn)支付寶支付的準(zhǔn)備工作: 1.向支付寶簽約,成為支付寶的商戶 簽約完成后延旧,支付寶會提供一些必要的數(shù)據(jù)給我們 商戶...
    Anson楊春安閱讀 8,190評論 0 6
  • 自己總結(jié)的微信支付寶支付流程和注意點(diǎn): 準(zhǔn)備工作: 需要公司的營業(yè)執(zhí)照谋国,稅務(wù)信息,等老板的身份證信息等迁沫,我記得芦瘾,用...
    Www劉閱讀 18,558評論 2 50