ios应用怎么app接入第三方支付付

iOS APP 微信支付宝支付接入指南
iOS APP 微信支付宝支付接入指南
话不多说直接上demo 云盘:链接: /s/1o7Mg4qA 密码: k25q下载之后注意修改账号才能运行注意事项:IOS openssl/asn1.h file not foundinclude&&跟# include&&的区别。比如 我把openssl这个文件导入到了这个工程目录下 :项目名称/公共类/工具&第三方/支付宝SDK/openssl ,中间隔了三个文件夹,那么在Header Search Paths 的设置就得改为 $(SRCROOT)/项目名 称/公共类/工具&第三方/支付宝SDK,问题就解决了再反过来看官方的demo,原来他们把openssl这个文件放到了项目根目录下,所以“Header Search Paths”只需要设置$(SRCROOT)/项目名称base64编码错误#import &Availability.h&#ifndef __IPHONE_5_0#warning &This project uses features only available in iOS SDK 5.0 and later.&#endif#ifdef __OBJC__#import &UIKit/UIKit.h&#import &Foundation/Foundation.h&#endif#define myAppDelegate ((AppDelegate*)[UIApplication sharedApplication].delegate)要导入的lib阿里支付需要注意路劲
本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。
百家号 最近更新:
简介: 过往不恋,未来不惧,当下不乱5787人阅读
IOS高级知识总结(104)
本章项目demo:&
本章不讲解: 微信sdk的集成 , 项目集成的文章请参照 (包含微信登录): &&
&1. 微信支付微信支付前奏大致流程为 :
1. 公司需要到微信进行申请app支付功能 ,&获得appid和微信支付商户号(mch_id)和API秘钥(key)
Appsecret(secret),开发中用到的,很重要
2. &下载微信SDK :&&
& & & 还有Demo地址.
3. & 根据上面的集成教程地址 ,搭建好项目
4. & 设置好URL Types ,(具体怎么设置也在环境搭建的文章中说到了,请大家注意看)。
5. & &记得把网络从https 改变成为 http。&
6. 设置微信白名单 。&
7. 现在基本就是环境搭配完毕了。&
2. 微信支付具体流程如下:
1. 流程图一览
2. 具体流程
步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。
步骤2:商户后台收到用户支付单,调用微信支付统一下单接口。参见【统一下单API】。
步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay
步骤4:商户APP调起微信支付。api参见本章节【app端开发步骤说明】
步骤5:商户后台接收支付通知。api参见【支付结果通知API】
步骤6:商户后台查询支付结果。,api参见【查询订单API】
3.开发前需要注意的几个方面。
1. 微信规定的规则,必须遵循,不然可能导致不能让微信支付成功。参照网址: &
2. 微信订单支付 ,参数规定 : &参照网址 :
3. 微信订单 ,参数的拼接, 签名的算法、 以及相关证书的详细讲解 : 参照网址:&
特别注意以下重要规则:
◆ 参数名ASCII码从小到大排序(字典序);
◆ 如果参数的值为空不参与签名;
◆ 参数名区分大小写;
◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段
开发参照微信官方api 地址 :&
微信开发 支付 签名参数校验:&
4. 具体的客户端开发过程:
步骤1:用户进入商户APP,选择商品下单、确认购买,进入支付环节。商户服务后台生成支付订单,签名后将数据传输到APP端,可参照官方支付demo。 &https://pay./wiki/doc/api/app/app.php?chapter=11_1
步骤2:用户点击后发起支付操作,进入到微信界面,调起微信支付,出现确认支付界面,。
步骤3:用户确认收款方和金额,点击立即支付后出现输入密码界面,可选择零钱或银行卡支付.
第四步:输入正确密码后,支付完成,用户端微信出现支付详情页面。
第五步:回跳到商户APP中,商户APP根据支付结果个性化展示订单处理结果.
5. 正式编程 。
1. 再次确认url schemes中设置 APPID ,&商户在微信开放平台申请开发APP应用后,微信开放平台会生成APP的唯一标识APPID。在Xcode中打开项目,设置项目属性中的URL Schemes为您的APPID。
<span style="font-family:Helvetica Neue,Hiragino Sans GB,Microsoft YaHei,黑体,Arial,sans- font-size:14 color:#. &商户APP工程中引入微信lib库和头文件,调用API前,需要先向微信注册您的APPID,代码如下:[WXApi
registerApp:@&wxd930ea5d5a258f4f& withDescription:@&123&];
3. 调起微信支付 (参数拼接, 签名)
4 支付结果回调&
核心代码展示 :&
回调方法展示:
appdelegate.m
/*! 微信回调,不管是登录还是分享成功与否,都是走这个方法 @brief 发送一个sendReq后,收到微信的回应
* 收到一个来自微信的处理结果。调用一次sendReq后会收到onResp。
* 可能收到的处理结果有SendMessageToWXResp、SendAuthResp等。
* @param resp具体的回应内容,是自动释放的
-(void) onResp:(BaseResp*)resp{
NSLog(@&resp %d&,resp.errCode);
WXErrCode {
WXErrCodeCommon
普通错误类型
WXErrCodeUserCancel = -2,
用户点击取消并返回
WXErrCodeSentFail
WXErrCodeAuthDeny
WXErrCodeUnsupport
微信不支持
if ([resp isKindOfClass:[SendAuthResp class]]) {
//授权登录的类。
if (resp.errCode == 0) {
//这里处理回调的方法 。 通过代理吧对应的登录消息传送过去。
if ([_wxDelegate respondsToSelector:@selector(loginSuccessByCode:)]) {
SendAuthResp *resp2 = (SendAuthResp *)
[_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 *)
NSLog(@&error code %d
error msg %@
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];
展示成功页面
可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
用户取消 无需处理。发生场景:用户不支付了,点击取消,返回APP。
if ([resp isKindOfClass:[PayResp class]]) { // 微信支付
PayResp*response=(PayResp*)
switch(response.errCode){
//服务器端查询支付通知或查询API返回的结果再提示成功
NSLog(@&支付成功&);
NSLog(@&支付失败,retcode=%d
errormsg %@&,resp.errCode ,resp.errStr);
方法调用。
viewController.m方法
#pragma mark 微信支付
- (IBAction)weixinPayAction:(id)sender {
外界调用的微信支付方法
@param ordeNumber
系统下发订单号% 得出的数字,确保唯一。
@param myNumber
@param price
1. 获取 AccessToken
2. 获取 genPackage
3. 调起微信付款
4. 在appdelegate 中的 onResp 监听 回调方法。 看是付款成功。
回调代码参数说明:
展示成功页面
可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
用户取消 无需处理。发生场景:用户不支付了,点击取消,返回APP。
helper = [[WeixinPayHelper alloc] init];
[helper payProductWith:@&Test Product& andName:@&product number 1& andPrice:[NSString stringWithFormat:@&%d&,1500]];
封装的核心支付工具类方法
WeixinPayHelper.h
WeixinPayHelper.h
weixinLoginDemo
Created by 张国荣 on 16/7/1.
Copyright &#169; 2016年 BateOrganization. All rights reserved.
#import &Foundation/Foundation.h&
#import &WXApi.h&
#import &AFNetworking.h&
微信支付工具类
@interface WeixinPayHelper : NSObject
@property (nonatomic, strong) AFHTTPSessionManager *
@property (nonatomic, copy) NSString *timeS
@property (nonatomic, copy) NSString *nonceS
@property (nonatomic, copy) NSString *traceId;
@property (nonatomic, copy) NSString *orderId;
@property (nonatomic, copy) NSString *orderP
@property (nonatomic, copy) NSString *orderAllId;
+ (instancetype)shareI
外界调用的微信支付方法
@param ordeNumber
系统下发订单号% 得出的数字,确保唯一。
@param myNumber
@param price
1. 获取 AccessToken
2. 获取 PrepayId 、 包含参数拼接,签名、genPackage等
3. 调起微信付款
4. 在appdelegate 中的 onResp 监听 回调方法。 看是付款成功。
回调代码参数说明:
展示成功页面
可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
用户取消 无需处理。发生场景:用户不支付了,点击取消,返回APP。
- (void)payProductWith:(NSString*)ordeNumber andName:(NSString*)myNumber andPrice:(NSString*)
WeixinPayHelper.m
WeixinPayHelper.m
weixinLoginDemo
Created by 张国荣 on 16/7/1.
Copyright &#169; 2016年 BateOrganization. All rights reserved.
#import &WeixinPayHelper.h&
#import &CommonUtil.h&
#import &Constant.h&
#define ISOFTEN_WECHARPAY_URL
@&/tenpay/payment/mobilesuccess&
@interface WeixinPayHelper()
@implementation WeixinPayHelper
NSString *AccessTokenKey = @&access_token&;
NSString *PrePayIdKey = @&prepayid&;
NSString *errcodeKey = @&errcode&;
NSString *errmsgKey = @&errmsg&;
NSString *expiresInKey = @&expires_in&;
微信开放平台申请得到的 appid, 需要同时添加在 URL schema
NSString * const WXAppId = @&app id&;
* 微信开放平台和商户约定的支付密钥
* 注意:不能hardcode在客户端,建议genSign这个过程由服务器端完成
NSString * const WXAppKey = @&appkey&;
* 微信开放平台和商户约定的密钥
* 注意:不能hardcode在客户端,建议genSign这个过程由服务器端完成
NSString * const WXAppSecret = @&app Secret&;
* 微信开放平台和商户约定的支付密钥
* 注意:不能hardcode在客户端,建议genSign这个过程由服务器端完成
NSString * const WXPartnerKey = @&秘钥、 放服务器的,这儿方便演示&;
微信公众平台商户模块生成的ID
NSString * const WXPartnerId = @&商户id&;
+ (instancetype)shareInstance
static WeixinPayHelper *sharedClient =
static dispatch_once_t onceT
dispatch_once(&onceToken, ^{
sharedClient = [[WeixinPayHelper
alloc] init];
return sharedC
外界调起微信下单的方法
@param ordeNumber 订单号 ,由服务器下发、经过处理的
生成genPackage 需要用到
@param myNumber
订单号 ,由服务器下发
生成genPackage 需要用到
@param price
生成genPackage 需要用到
- (void)payProductWith:(NSString *)ordeNumber andName:(NSString *)myNumber andPrice:(NSString *)price{
self.orderId = ordeN
self.orderPrice =
self.orderAllId = myN
[self getAccessToken];
#pragma mark - 生成各种参数
#pragma mark 时间戳 生成
- (NSString *)genTimeStamp
return [NSString stringWithFormat:@&%.0f&, [[NSDate date] timeIntervalSince1970]];
* 注意:商户系统内部的订单号,32个字符内、可包含字母,确保在商户系统唯一
- (NSString *)genNonceStr
return [CommonUtil md5:[NSString stringWithFormat:@&%d&, arc4random() % 10000]];
* 建议 traceid 字段包含用户信息及订单信息,方便后续对订单状态的查询和跟踪
- (NSString *)genTraceId
return [NSString stringWithFormat:@&crestxu_%@&, [self genTimeStamp]];
- (NSString *)genOutTradNo
return [CommonUtil md5:[NSString stringWithFormat:@&%d&, arc4random() % 10000]];
#pragma mark genPackage 这个应该是服务器完成。 在这儿方便演示。
- (NSString *)genPackage
// 构造参数列表
NSMutableDictionary *params = [NSMutableDictionary dictionary];
[params setObject:@&WX& forKey:@&bank_type&];
[params setObject:[NSString stringWithFormat:@&拾裳%@订单&, self.orderAllId] forKey:@&body&];
[params setObject:@&1& forKey:@&fee_type&];
[params setObject:@&UTF-8& forKey:@&input_charset&];
[params setObject:ISOFTEN_WECHARPAY_URL forKey:@&notify_url&];
[params setObject:[self genOutTradNo] forKey:@&out_trade_no&];
[params setObject:WXPartnerId forKey:@&partner&];
[params setObject:[CommonUtil getIPAddress:YES] forKey:@&spbill_create_ip&];
[params setObject:self.orderPrice forKey:@&total_fee&];
// 1 == &#165;0.01
NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:[[NSURL URLWithString:@&&] absoluteURL]];
NSHTTPCookie *
NSMutableArray* arr=[NSMutableArray array];
for (cookie in cookies) {
if (![cookie.name isEqualToString:@&app_code&]) {
NSString* str=[NSString stringWithFormat:@&%@||%@&,cookie.name,cookie.value];
[arr addObject:str];
NSString* aa=[arr componentsJoinedByString:@&||&];
[params setObject:[NSString stringWithFormat:@&%@||%@||%@&,self.orderId,[CommonUtil md5:[NSString stringWithFormat:@&fef54y3d5wsxf5yu55t5g5d5e35yujki%@&,self.orderId]],aa] forKey:@&attach&];
NSArray *keys = [params allKeys];
NSArray *sortedKeys = [keys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2 options:NSNumericSearch];
// 生成 packageSign
NSMutableString *package = [NSMutableString string];
for (NSString *key in sortedKeys) {
[package appendString:key];
[package appendString:@&=&];
[package appendString:[params objectForKey:key]];
[package appendString:@&&&];
[package appendString:@&key=&];
[package appendString:WXPartnerKey]; // 注意:不能hardcode在客户端,建议genPackage这个过程都由服务器端完成
// 进行md5摘要前,params内容为原始内容,未经过url encode处理
NSString *packageSign = [[CommonUtil md5:[package copy]] uppercaseString];
// 生成 packageParamsString
NSString *value =
package = [NSMutableString string];
for (NSString *key in sortedKeys) {
[package appendString:key];
[package appendString:@&=&];
value = [params objectForKey:key];
// 对所有键值对中的 value 进行 urlencode 转码
value = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)value, nil, (CFStringRef)@&!*&#39;&=();:@+$,/?%#[]&, kCFStringEncodingUTF8));
[package appendString:value];
[package appendString:@&&&];
NSString *packageParamsString = [package substringWithRange:NSMakeRange(0, package.length - 1)];
NSString *result = [NSString stringWithFormat:@&%@&sign=%@&, packageParamsString, packageSign];
- (NSString *)genSign:(NSDictionary *)signParams
NSArray *keys = [signParams allKeys];
NSArray *sortedKeys = [keys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2 options:NSNumericSearch];
NSMutableString *sign = [NSMutableString string];
for (NSString *key in sortedKeys) {
[sign appendString:key];
[sign appendString:@&=&];
[sign appendString:[signParams objectForKey:key]];
[sign appendString:@&&&];
NSString *signString = [[sign copy] substringWithRange:NSMakeRange(0, sign.length - 1)];
NSString *result = [CommonUtil sha1:signString];
- (NSMutableDictionary *)getProductArgs
self.timeStamp = [self genTimeStamp];
self.nonceStr = [self genNonceStr]; // traceId 由开发者自定义,可用于订单的查询与跟踪,建议根据支付用户信息生成此id
self.traceId = [self genTraceId];
NSMutableDictionary *params = [NSMutableDictionary dictionary];
[params setObject:WXAppId forKey:@&appid&];
[params setObject:WXAppKey forKey:@&appkey&];
[params setObject:self.timeStamp forKey:@&noncestr&];
[params setObject:self.timeStamp forKey:@&timestamp&];
[params setObject:self.traceId forKey:@&traceid&];
[params setObject:[self genPackage] forKey:@&package&];
[params setObject:[self genSign:params] forKey:@&app_signature&];
[params setObject:@&sha1& forKey:@&sign_method&];
NSError *error =
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:params options:NSJSONWritingPrettyPrinted error: &error];
#pragma mark - 主体流程 - 获取 accessToken , 然后调用再拿着accessToken调用微信的支付接口。
- (void)getAccessToken
NSString *getAccessTokenUrl = [NSString stringWithFormat:@&https://api./cgi-bin/token?grant_type=client_credential&appid=%@&secret=%@&, WXAppId, WXAppSecret];
self.request = [AFHTTPSessionManager manager];
__weak WeixinPayHelper *weakSelf =
self.request.requestSerializer = [AFJSONRequestSerializer serializer];//请求
self.request.responseSerializer = [AFHTTPResponseSerializer serializer];//响应
self.request.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@&text/html&,@&application/json&, @&text/json&,@&text/plain&, nil];
[self.request POST:getAccessTokenUrl parameters:nil progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id
_Nullable responseObject) {
NSError *error =
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:kNilOptions
error:&error];
if (error) {
[weakSelf showAlertWithTitle:@&错误& msg:@&获取 AccessToken 失败&];
NSString *accessToken = dict[AccessTokenKey];
if (accessToken) {
__strong WeixinPayHelper *strongSelf = weakS
[strongSelf getPrepayId:accessToken];
NSString *strMsg = [NSString stringWithFormat:@&errcode: %@, errmsg:%@&, dict[errcodeKey], dict[errmsgKey]];
[weakSelf showAlertWithTitle:@&错误& msg:strMsg];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[weakSelf showAlertWithTitle:@&错误& msg:@&获取 AccessToken 失败&];
#pragma mark 根据accessToken 获取 PrePayID . 然后进行下单。
- (void)getPrepayId:(NSString *)accessToken
NSString *getPrepayIdUrl = [NSString stringWithFormat:@&https://api./pay/genprepay?access_token=%@&, accessToken];
NSMutableDictionary *postData = [self getProductArgs];
__weak WeixinPayHelper *weakSelf =
self.request = [AFHTTPSessionManager manager];
self.request.requestSerializer = [AFJSONRequestSerializer serializer];//请求
self.request.responseSerializer = [AFHTTPResponseSerializer serializer];//响应
self.request.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@&text/html&,@&application/json&, @&text/json&,@&text/plain&, nil];
[self.request POST:getPrepayIdUrl parameters:postData progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id
_Nullable responseObject) {
NSError *error =
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:kNilOptions
error:&error];
if (error) {
[weakSelf showAlertWithTitle:@&错误& msg:@&获取 PrePayId 失败&];
NSString *prePayId = dict[PrePayIdKey];
if (prePayId) {
// 调起微信支付
PayReq *request
= [[PayReq alloc] init];
request.partnerId = WXPartnerId;
request.prepayId
= prePayId;
request.package
= @&Sign=WXPay&;
// 文档为 `Request.package = _` , 但如果填写上面生成的 `package` 将不能支付成功
request.nonceStr
= weakSelf.nonceS
request.timeStamp = [weakSelf.timeStamp longLongValue];
// 构造参数列表
NSMutableDictionary *params = [NSMutableDictionary dictionary];
[params setObject:WXAppId forKey:@&appid&];
[params setObject:WXAppKey forKey:@&appkey&];
[params setObject:request.nonceStr forKey:@&noncestr&];
[params setObject:request.package forKey:@&package&];
[params setObject:request.partnerId forKey:@&partnerid&];
[params setObject:request.prepayId forKey:@&prepayid&];
[params setObject:weakSelf.timeStamp forKey:@&timestamp&];
request.sign = [weakSelf genSign:params];
// 在支付之前,如果应用没有注册到微信,应该先调用 [WXApi registerApp:appId] 将应用注册到微信
[WXApi sendReq:request];
NSString *strMsg = [NSString stringWithFormat:@&errcode: %@, errmsg:%@&, dict[errcodeKey], dict[errmsgKey]];
[weakSelf showAlertWithTitle:@&错误& msg:strMsg];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[weakSelf showAlertWithTitle:@&错误& msg:@&获取 PrePayId 失败&];
#pragma mark - Alert
- (void)showAlertWithTitle:(NSString *)title msg:(NSString *)msg
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:title message: msg delegate: self cancelButtonTitle:@&确定& otherButtonTitles:nil, nil];
[alert show];
&我这里付款做的比官方的demo做的复杂了很多, 做了很多服务器要做的事情,比如说&签名算法
、 以及参数按照key=value的&#26684;式 、 拼接秘钥 等。&
我介意没有特殊要求的朋友,就稍微看看,不必自己再操作一遍。
&大家多去看看官方的api,上面讲的很详细。&
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:564308次
积分:6498
积分:6498
排名:第3920名
原创:90篇
转载:146篇
评论:129条
(2)(1)(2)(2)(1)(2)(4)(2)(3)(6)(11)(4)(23)(14)(28)(26)(27)(12)(7)(14)(16)(18)(9)(3)(1)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
威锋网7月10日消锋网7月10日消息,《植物大战僵尸2》 如今...
威锋网7月10日消息,《植物大...
近日,开发商 Esquilax Games ..
说到方块游戏,相信有很多朋友应该还会记得 Gavina Games 早...
威锋网7月10日消息,《植物大...
近日,开发商 Esquilax Games ..
说到方块游戏,相信有很多朋友应该还会记得 Gavina Games 早...
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
您需要通过验证再能继续浏览 3秒后开始验证
威锋旗下产品
Hi~我是威威!
 粤公网安备 11号
新三板上市公司威锋科技(836555)
增值电信业务经营许可证:
Powered by Discuz!}

我要回帖

更多关于 怎样接入第三方支付 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信