iOS-支付寶&微信支付,接入筆記

MY BLOG--->

Demo

Demo下載地址
demo使用時(shí),請(qǐng)?jiān)赪TPayKeys.h里面將各個(gè)參數(shù)配置好!!!!

一. 微信支付

1.所需要的材料

  • 微信SDK
    微信SDK
  • 在微信開放平臺(tái)上面申請(qǐng)得到的參數(shù)

// 應(yīng)用的APPID
kWXAppID @"wxc82cXXXXXXXX"
// AppSecret
kWXAppSecret @"7f47bfe47b84XXXXXXXXXXXx"
//商戶號(hào)
kWXMchID @"1242XXXXXX"
//商戶API密鑰
kWXPartnerID @"n1LeHtXUV9ZuPp156mcmXXXXXXXXX"
//支付結(jié)果回調(diào)頁面
kWXNotifyURL @"http://XXXXXXXXX"

1.2 微信支付工程配置

// 需要的系統(tǒng)依賴

SystemConfiguration.framework
libz.dylib
libsqlite3.0.dylib
libc++.dylib

2.調(diào)起微信客戶端代碼

    [WXApi registerApp:weichat_appid];
    //調(diào)起微信支付
    PayReq* req             = [[PayReq alloc] init];
    req.partnerId           = item.partnerid;
    req.prepayId            = item.prepayid;
    req.nonceStr            = item.noncestr;
    req.timeStamp           = [item.timestamp intValue];
    req.package             = item.package;
    req.sign                = item.sign;
    
    [WXApi sendReq:req];

問: 微信支付怎么支付?
答: 其實(shí)就是上面的代碼.

  • 創(chuàng)建一個(gè)PayReq對(duì)象req, 然后[WXApi sendReq:req]; 就這么簡(jiǎn)單.
    難就難在,怎么得到PayReq對(duì)象所需要的那些值,一共六個(gè)值.
    而這六個(gè)值其他的值好說,就兩個(gè):prepayId和sign比較麻煩.
  • 獲取prepayId(預(yù)支付訂單)是需要發(fā)請(qǐng)求給微信(統(tǒng)一下單),然后微信返回結(jié)果給我們的.
  • 而sign前面的話,各種參數(shù)柔和在一起,MD5一下,也比較煩.

3.拿到prepayId

怎么拿?
官方文檔---->統(tǒng)一下單
就是發(fā)一個(gè)請(qǐng)求給微信,然后微信返回prepayId給你.官方要求統(tǒng)一下單要放在我們的服務(wù)器做.--------這是個(gè)好事情!!!!!!!!!!!
服務(wù)器端完成的!!!!哈哈哈哈,其實(shí)放在服務(wù)器端做的話,接入微信支付就沒什么好說的了.

其實(shí)不用服務(wù)端,我們也可以完成. 就是我們自己發(fā)請(qǐng)求然后拿到prepayId,我只是說我們自己可以做,但是現(xiàn)實(shí)中我們應(yīng)當(dāng)放在服務(wù)端,官方文檔就是這么要求,這樣我們省了好多事的好不,接入微信就很簡(jiǎn)單了.</br>
但是為了演示效果,而又沒有現(xiàn)成的服務(wù)器接口給我們.所以Demo中,我是將說有過程寫在我們本地.

放在我們本地的做法
1.我們想這個(gè)接口:@"https://api.mch.weixin.qq.com/pay/unifiedorder" 發(fā)一個(gè)post請(qǐng)求

2.參數(shù)
aped //開放平臺(tái)appid
mch_id //商戶號(hào)
nonce_str//隨機(jī)串
trade_type //支付類型,固定為APP
body //訂單描述,展示給用戶, 就是商品名
notify_url //支付結(jié)果異步通知, 就是kWXNotifyURL
out_trade_no //商戶訂單號(hào) 我們自己設(shè)定的訂單號(hào)
spbill_create_ip // //發(fā)器支付的機(jī)器ip
total_fee //訂單金額,單位為分

sign // 簽名, 就是上面那些參數(shù)按照字母順序拼接成一個(gè)字符串,然后再拼接一個(gè)kWXPartnerID . 有關(guān)sign(簽名)的生成可以參考官方文檔,或者看下面關(guān)于sign的"通俗說法",或者直接看Demo

4.partnerId 商家向財(cái)付通申請(qǐng)的商家id

// 商家向財(cái)付通申請(qǐng)的商家id 這個(gè)不用說, 自己去微信開放平臺(tái)上拿

5.nonceStr 隨機(jī)串

/**
 *  生成隨機(jī)字符串
 *
 *  @param kNumber 訂單號(hào)的長(zhǎng)度
 */
- (NSString *)generateRomNumWithNumber: (NSInteger)kNumber
{
    
    NSString *sourceStr = @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    NSMutableString *resultStr = [[NSMutableString alloc] init];
    srand((unsigned int)time(0));
    for (NSInteger i = 0; i < kNumber; i++)
    {
        unsigned index = rand() % [sourceStr length];
        NSString *oneStr = [sourceStr substringWithRange:NSMakeRange(index, 1)];
        [resultStr appendString:oneStr];
    }
    return resultStr;
}

6.timeStamp 時(shí)間戳

time_t now;
time(&now);
time_stamp  = [NSString stringWithFormat:@"%ld", now];

7.package 商家根據(jù)財(cái)付通文檔填寫的數(shù)據(jù)和簽名

這個(gè)是個(gè)死值 Sign=WXPay
官方文檔說:暫填寫固定值Sign=WXPay

8.sign

官方文檔這么說的</br>
簽名算法
簽名生成的通用步驟如下:
第一步,設(shè)所有發(fā)送或者接收到的數(shù)據(jù)為集合M,將集合M內(nèi)非空參數(shù)值的參數(shù)按照參數(shù)名ASCII碼從小到大排序(字典序),使用URL鍵值對(duì)的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特別注意以下重要規(guī)則:
◆ 參數(shù)名ASCII碼從小到大排序(字典序);
◆ 如果參數(shù)的值為空不參與簽名;
◆ 參數(shù)名區(qū)分大小寫;
◆ 驗(yàn)證調(diào)用返回或微信主動(dòng)通知簽名時(shí),傳送的sign參數(shù)不參與簽名,將生成的簽名與該sign值作校驗(yàn)。
◆ 微信接口可能增加字段,驗(yàn)證簽名時(shí)必須支持增加的擴(kuò)展字段
第二步,在stringA最后拼接上key得到stringSignTemp字符串,并對(duì)stringSignTemp進(jìn)行MD5運(yùn)算,再將得到的字符串所有字符轉(zhuǎn)換為大寫,得到sign值signValue。


通俗的說:
1.就是拿到PayReq對(duì)象的其他5個(gè)值,參數(shù)名ASCII碼從小到大排序(字典序),然后
a字母順序第一個(gè)appid,就是第一,然后后面的同樣按照字母先后順序一個(gè)&一個(gè)那么拼接成一個(gè)字符串.

str1 = @"appid=wxd930ea5d5a258f4f&package=Sign=WXPay......";

2.得到上面的字符串以后了再在后的字符串后面拼接上key
// kWXPartnerID @"n1LeHtXUV9ZuPp156mcmXXXXXXXXX"
str2 = [str1 appendFormat:@"key=%@", kWXPartnerID];

然后對(duì)str2 MD5加密一下,就得到了sign了.

如果是按照官方文檔"統(tǒng)一下單API、支付結(jié)果通知API和查詢訂單API等都涉及簽名過程,調(diào)用都必須在商戶服務(wù)器端完成。"這樣,上面的這些所有參數(shù)你都不用管,你要做的只是,拿到你們APP里面商品的價(jià)格,商品名什么的發(fā)給后臺(tái),然后后臺(tái)就會(huì)把你需要的這些所有參數(shù)給你,然后你拿著這些參數(shù)調(diào)起微信就ok!

</br></br>

二.支付寶支付

1.需要的材料

支付寶SDK
下載下來解壓文件如圖

Snip20160709_15.png

// 解壓iOS那個(gè)zip


Snip20160709_17.png

// 得到如圖

Snip20160709_18.png

// 我們需要的文件有如圖

Snip20160709_19.png

// 在我們工程里面新建一個(gè)文件夾Alipay將上面我們需要的文件放在文件Alipay下

Snip20160709_20.png

// 支付寶需要的系統(tǒng)庫(kù)

"1"CFNetwork.framework
"2"CoreMotion.framework
"3"“SystemConfiguration.framework”,
"4"“CoreGraphics.Framework”、
"5"“CoreTelephony.framework”
"6"“l(fā)ibz.dylib”
"7"libc++.dylib
"8"QuartzCore.framework
"9"CoreText.framework

// 在支付寶上申請(qǐng)得到的參數(shù)


#ifndef __OPTIMIZE__
#define kPayNotifyURL @"http://WWW.XXXX.XXXXXXXXX"
#else
#define kPayNotifyURL @"https://WWW.FFFF.XXXXXXX"
#endif
#define kPrivateKey @"SDGSFHGDFHGSVF$%#$RFFDSFASFASFASFSDFASDFASDCVCVZXVZXCVZXCVZXCVXCVZXCVGQWY%##$T@!RXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"http:// 
#define kSeller @"20XXXXXXXXXXXXXX"
#define kPartner @"20XXXXXXXXXXXXX"

kPayNotifyURL
kPrivateKey
kSeller
kPartner

2.支付實(shí)現(xiàn)

我是用WTPayManager統(tǒng)一管理微信和支付寶支付的
在WTPayManager里包含

import <AlipaySDK/AlipaySDK.h>

調(diào)用支付寶代碼

+ (void)aliPayWithOrderItem:(WTPayOrderItem *)orderItem
{
    /*
     *商戶的唯一的parnter和seller。
     *簽約后,支付寶會(huì)為每個(gè)商戶分配一個(gè)唯一的 parnter 和 seller。
     */
    
    /*
     *生成訂單信息及簽名
     */
    //將商品信息賦予AlixPayOrder的成員變量
    Order *order = [[Order alloc] init];
    order.partner = kPartner;
    order.sellerID = kSeller;
    order.outTradeNO = orderItem.orderOutTradeNO;//訂單ID(由商家自行制定)
    
    order.subject = orderItem.orderName;//商品標(biāo)題
    order.body = orderItem.orderBody; //商品描述
    order.totalFee = orderItem.orderPrice; //商品價(jià)格
    order.notifyURL = kPayNotifyURL;
    order.service = @"mobile.securitypay.pay";//接口名稱,固定為mobile.securitypay.pay。
    order.paymentType = @"1";
    order.inputCharset = @"utf-8";
    order.itBPay = @"30m";
    order.showURL = @"m.alipay.com";
    
    //應(yīng)用注冊(cè)scheme,在AlixPayDemo-Info.plist定義URL types
    NSString *appScheme = @"XXXXXXXXXX";
    
    //將商品信息拼接成字符串
    NSString *orderSpec = [order description];
    NSLog(@"orderSpec = %@",orderSpec);
    
    //獲取私鑰并將商戶信息簽名,外部商戶可以根據(jù)情況存放私鑰和簽名,只需要遵循RSA簽名規(guī)范,并將簽名字符串base64編碼和UrlEncode
    id<DataSigner> signer = CreateRSADataSigner(kPrivateKey);
    NSString *signedString = [signer signString:orderSpec];
    
    //將簽名成功字符串格式化為訂單字符串,請(qǐng)嚴(yán)格按照該格式
    
//    __weak typeof(self) weakSelf = self;
    NSString *orderString = nil;
    if (signedString != nil) {
        orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
                       orderSpec, signedString, @"RSA"];
        
        [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
            
            NSLog(@"resultDic=%@",resultDic);
            
            //[weakSelf handleAlipayResponse:resultDic];
        }];
        
    }else{
        //[self handleAlipayResponse:nil];
    }

}

// 支付寶支付相對(duì)微信來說簡(jiǎn)單些

拿到
kPayNotifyURL
kPrivateKey
kSeller
kPartner
這幾個(gè)參數(shù)
加上我們的商品價(jià)格,名稱,商品訂單,本地加個(gè)密,往支付寶一推,就ok了.

集成支付寶openssl可能會(huì)出現(xiàn)
導(dǎo)入SDK或者調(diào)用支付寶失敗的情況
1.0 openssl/asn1.h file not found
點(diǎn)擊這里答案,感謝-----荏苒少年

三.統(tǒng)一配置

info.plist // 文件下加入這個(gè)

<key>LSApplicationQueriesSchemes</key>
    <array>
        <string>sinaweibohd</string>
        <string>sinaweibo</string>
        <string>sinaweibosso</string>
        <string>weibosdk</string>
        <string>weibosdk2.5</string>
        <string>mqqapi</string>
        <string>mqq</string>
        <string>mqqOpensdkSSoLogin</string>
        <string>mqqconnect</string>
        <string>mqqopensdkdataline</string>
        <string>mqqopensdkgrouptribeshare</string>
        <string>mqqopensdkfriend</string>
        <string>mqqopensdkapi</string>
        <string>mqqopensdkapiV2</string>
        <string>mqqopensdkapiV3</string>
        <string>mqzoneopensdk</string>
        <string>wtloginmqq</string>
        <string>wtloginmqq2</string>
        <string>mqqwpa</string>
        <string>mqzone</string>
        <string>mqzonev2</string>
        <string>mqzoneshare</string>
        <string>wtloginqzone</string>
        <string>mqzonewx</string>
        <string>mqzoneopensdkapiV2</string>
        <string>mqzoneopensdkapi19</string>
        <string>mqzoneopensdkapi</string>
        <string>mqzoneopensdk</string>
        <string>alipay</string>
        <string>alipayshare</string>
    </array>
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
Snip20160709_21.png

// PCH

Snip20160709_22.png

// -ObjC

Snip20160709_23.png

// URL Schemes

Snip20160709_24.png

四. WTPayManager 代碼實(shí)現(xiàn)

WTPayManager.h

//
//  WTPayManager.h
//  WT_Pay
//
//  Created by Mac on 16/7/5.
//  Copyright ? 2016年 wutong. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <AlipaySDK/AlipaySDK.h>
#import "WXApi.h"


@interface WTPayOrderItem : NSObject

/**
 商品名稱
 */
@property (nonatomic, strong)NSString * orderName;

/**
商品價(jià)格
 
 支付寶的單位是元
 微信的單位是分
*/
@property (nonatomic, strong)NSString * orderPrice;

/**
訂單號(hào)
*/
@property (nonatomic, strong)NSString * orderOutTradeNO;

/**
 商品描述
 */
@property (nonatomic, strong)NSString * orderBody;


@end




typedef NS_ENUM(NSInteger, WTPayType) {
    WTPayTypeAli = 0,   // 支付寶支付
   WTPayTypeWeixin  // 微信支付
};

typedef NS_ENUM(NSInteger, WTPayAilPayResultType) {
    WTPayAilPayResultTypeSucess = 9000,   // 支付成功
    WTPayAilPayResultTypeCancel = 6001// 用戶取消
};

typedef void(^WTPayResultBlock)(NSDictionary * payResult, NSString * error);
@interface WTPayManager : NSObject<WXApiDelegate>


+ (instancetype)shareWTPayManager;
- (void)handleAlipayResponse:(NSDictionary *)resultDic;


+ (void)wtPayOrderItem:(WTPayOrderItem *)orderItem payType:(WTPayType)type result:(WTPayResultBlock)result;
@end





WTPayManager.m

//
//  WTPayManager.m
//  WT_Pay
//
//  Created by Mac on 16/7/5.
//  Copyright ? 2016年 wutong. All rights reserved.
//

#import "WTPayManager.h"
#import "payRequsestHandler.h"
#import "Order.h"
#import "DataSigner.h"

@interface WTPayManager ()<NSCopying>
@property (nonatomic, copy)WTPayResultBlock result;
@end

@implementation WTPayManager

+ (void)initialize
{
    [WTPayManager shareWTPayManager];
}


static WTPayManager * _instance;

+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [super allocWithZone:zone];
        [_instance setRegisterApps];
    });
    return _instance;
}

+ (instancetype)shareWTPayManager
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [[self alloc]init];
        [_instance setRegisterApps];
    });
    return _instance;
}


- (id)copyWithZone:(nullable NSZone *)zone
{
    return _instance;
}



// 注冊(cè)appid
- (void)setRegisterApps
{    // 微信注冊(cè)
    [WXApi registerApp:kWXAppID];
}

+ (void)wtPayOrderItem:(WTPayOrderItem *)orderItem payType:(WTPayType)type result:(WTPayResultBlock)result
{
    [WTPayManager shareWTPayManager].result = result;
    if (type == WTPayTypeWeixin) {
        [WTPayManager weixinPayWithOrderItem:orderItem];
    }else if (type == WTPayTypeAli){
        [WTPayManager aliPayWithOrderItem:orderItem];
    }
}
+ (void)aliPayWithOrderItem:(WTPayOrderItem *)orderItem
{
    /*
     *商戶的唯一的parnter和seller。
     *簽約后,支付寶會(huì)為每個(gè)商戶分配一個(gè)唯一的 parnter 和 seller。
     */
    
    /*
     *生成訂單信息及簽名
     */
    //將商品信息賦予AlixPayOrder的成員變量
    Order *order = [[Order alloc] init];
    order.partner = kPartner;
    order.sellerID = kSeller;
    order.outTradeNO = orderItem.orderOutTradeNO;//訂單ID(由商家自行制定)
    
    order.subject = orderItem.orderName;//商品標(biāo)題
    order.body = orderItem.orderBody; //商品描述
    order.totalFee = orderItem.orderPrice; //商品價(jià)格
    order.notifyURL = kPayNotifyURL;
    order.service = @"mobile.securitypay.pay";
    order.paymentType = @"1";
    order.inputCharset = @"utf-8";
    order.itBPay = @"30m";
    order.showURL = @"m.alipay.com";
    
    //應(yīng)用注冊(cè)scheme,在AlixPayDemo-Info.plist定義URL types
    NSString *appScheme = @"mralipaysdk";
    
    //將商品信息拼接成字符串
    NSString *orderSpec = [order description];
    NSLog(@"orderSpec = %@",orderSpec);
    
    //獲取私鑰并將商戶信息簽名,外部商戶可以根據(jù)情況存放私鑰和簽名,只需要遵循RSA簽名規(guī)范,并將簽名字符串base64編碼和UrlEncode
    id<DataSigner> signer = CreateRSADataSigner(kPrivateKey);
    NSString *signedString = [signer signString:orderSpec];
    
    //將簽名成功字符串格式化為訂單字符串,請(qǐng)嚴(yán)格按照該格式
    
//    __weak typeof(self) weakSelf = self;
    NSString *orderString = nil;
    if (signedString != nil) {
        orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
                       orderSpec, signedString, @"RSA"];
        
        [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
            
            NSLog(@"resultDic=%@",resultDic);
            
            //[weakSelf handleAlipayResponse:resultDic];
        }];
        
    }else{
        //[self handleAlipayResponse:nil];
    }

}

- (void)handleAlipayResponse:(NSDictionary *)resultDic
{
    
//    resultDic;
    NSLog(@"%@", resultDic);
    
    if ([resultDic[@"resultStatus"] integerValue] != WTPayAilPayResultTypeSucess) {
        
        NSString * errorStr;
        errorStr = resultDic[@"memo"] ? resultDic[@"memo"] : @"支付失敗";
        self.result(nil, errorStr);
    }else{
        NSDictionary * response = @{@"result":@"支付寶支付成功!"};
        self.result(response,nil);
    }
    
    
}




+ (void)weixinPayWithOrderItem:(WTPayOrderItem *)orderItem
{

    payRequsestHandler *payObj = [payRequsestHandler sharedInstance];
    //1. 拿到prepayId 和 sign, 其他參數(shù)寫在外面都行
    NSDictionary * dict = [payObj sendPay:orderItem.orderName orderPrice:orderItem.orderPrice outTradeNo:orderItem.orderOutTradeNO];


    // 2.調(diào)起微信支付
    if(dict != nil){
        NSMutableString *retcode = [dict objectForKey:@"retcode"];
        if (retcode.intValue == 0){
            NSMutableString *stamp  = [dict objectForKey:@"timestamp"];
            
            //調(diào)起微信支付
            PayReq* req             = [[PayReq alloc] init];
            req.partnerId           = [dict objectForKey:@"partnerid"];
            req.prepayId            = [dict objectForKey:@"prepayid"];
            req.nonceStr            = [dict objectForKey:@"noncestr"];
            req.timeStamp           = stamp.intValue;
            req.package             = [dict objectForKey:@"package"];
            req.sign                = [dict objectForKey:@"sign"];
            
            BOOL success = [WXApi sendReq:req];
            if(!success){
                NSLog(@"調(diào)微信失敗");
            }
            return;
        }else{
            NSLog(@"%@",[dict objectForKey:@"retmsg"]);
        }
    }else{
        NSLog(@"服務(wù)器返回錯(cuò)誤");
    }


    
}




-(void)onResp:(BaseResp*)resp{
    if ([resp isKindOfClass:[PayResp class]]){
        PayResp*response=(PayResp*)resp;
        
        
        if (response.errCode == WXSuccess) {
            NSDictionary * response = @{@"result":@"微信支付成功!"};
            self.result(response,nil);

        }else{
            NSLog(@"支付失敗,retcode=%d",resp.errCode);
            
            self.result(nil,@"支付失敗");
            
        }
    }
}

@end



@implementation WTPayOrderItem
@end

Demo

Demo下載地址
demo使用時(shí),請(qǐng)?jiān)赪TPayKeys.h里面將各個(gè)參數(shù)配置好!!!!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 自己總結(jié)的微信支付寶支付流程和注意點(diǎn): 準(zhǔn)備工作: 需要公司的營(yíng)業(yè)執(zhí)照,稅務(wù)信息,等老板的身份證信息等,我記得,用...
    Www劉閱讀 18,679評(píng)論 2 50
  • 實(shí)現(xiàn)支付寶支付的準(zhǔn)備工作: 1.向支付寶簽約,成為支付寶的商戶 簽約完成后,支付寶會(huì)提供一些必要的數(shù)據(jù)給我們 商戶...
    Anson楊春安閱讀 8,613評(píng)論 0 6
  • 準(zhǔn)備工作: 需要公司的營(yíng)業(yè)執(zhí)照,稅務(wù)信息,等老板的身份證信息等,我記得,用這些材料,去支付寶注冊(cè)一個(gè)商家賬戶(審核...
    Hevin_Chen閱讀 6,872評(píng)論 0 9
  • 我們都知道,獨(dú)立是一種好的向上的能力,人類獨(dú)立的第一步就是斷奶,然后慢慢從一個(gè)全能依靠父母的嬰兒,變成一個(gè)具...
    茫茫不慌閱讀 824評(píng)論 0 0
  • 心藍(lán)老師的課已經(jīng)結(jié)束很久了,而我今天才把作業(yè)完成。在這段并不長(zhǎng)的日子里,老師教我們一件關(guān)于畫畫非常重要的事——開始...
    civilian閱讀 332評(píng)論 2 1

友情鏈接更多精彩內(nèi)容