ios支付

#import <Foundation/Foundation.h>

#import <AVFoundation/AVFoundation.h>

#import <StoreKit/StoreKit.h>

#import <WebKit/WKWebView.h>

@interface TXObjectLoginPay : NSObject<SKPaymentTransactionObserver,SKProductsRequestDelegate>{

TXObjectLoginPay* objectLoginPay;

NSString* mReceiptData;

NSString* mPayAddress;

int mRechargeCfgId;

NSString* mAmount;

int mServerId;

NSString* mUserId;

int mRoleId;

int mUid;

WKWebView *wkwebView1;

}

  • (void)initWebview:(WKWebView *)webView;

  • (void)onObjC_IOS_InitPay:(void *) iosurl;

-(void)onObjC_IOSPay:

(NSString *)rechargeCfgId

secondKid: (NSString *) amount

secondKid1: (NSNumber *) serverId

secondKid2: (NSString *) userId

secondKid3: (NSNumber *) roleId

secondKid4: (NSNumber *) uid;

@end

#import "TXObjectLoginPay.h"

#include "YLWwiseEngine.h"

#include "PostObj.h"

//#import <AuthenticationServices/AuthenticationServices.h>

#import <StoreKit/StoreKit.h>

//登录借口

@interface TXObjectLoginPay ()

@property (nonatomic, copy) NSString *userId2; // 声明为成员变量

@end

@implementation TXObjectLoginPay

  • (void)initWebview:(WKWebView *)webView {

wkwebView1=webView;

const char *str = "Hello";

char *strPtr = const_cast<char *>(str);

self onObjC_IOS_InitPay:strPtr;

}

// 1.支付初始化,进入游戏就开始初始化

  • (void)onObjC_IOS_InitPay:(void *) iosurl{

char* pChar = (char*)iosurl;

NSString *str2 = NSString stringWithUTF8String:pChar;

\[SKPaymentQueue defaultQueue addTransactionObserver:self];

}

//2.开始拉起支付

-(void)onObjC_IOSPay:(NSString *)rechargeCfgId

secondKid: (NSString *) amount

secondKid1: (NSNumber *) serverId

secondKid2: (NSString *) userId

secondKid3: (NSNumber *) roleId

secondKid4: (NSNumber *) uid

{

NSString *product = rechargeCfgId;

NSString* log1 =@"--1.pull recharge---";

self PrintIOSLog:log1;

self PrintIOSLog:product;

self.userId2 = userId;

NSLog(@"--------userId2:%@", self.userId2);

//NSString *product = NSString stringWithFormat:@"%d",rechargeCfgId;

NSLog(@"--------product:%@", product);

NSArray *product1 = \[NSArray alloc initWithObjects:product, nil];

NSLog(@"--------product1:%@", product1);

NSSet *nsset = NSSet setWithArray:product1;

SKProductsRequest *request = \[SKProductsRequest alloc initWithProductIdentifiers:nsset];

request.delegate = self;

request start;

}

//请求对应的产品信息

  • (void)requestProductData:(NSString *)type

{

}

//3.收到产品返回信息

  • (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response

{

NSArray *product = response.products;

if(product count == 0)

{

NSLog(@"--------------没有商品------------------");

NSString* log1 =@"--2.no product---";

self PrintIOSLog:log1;

return;

}

NSLog(@"productID:%@", response.invalidProductIdentifiers);

NSLog(@"产品付费数量:%d",(int)product count);

NSString* log1 =@"--3.product---";

self PrintIOSLog:log1;

for (SKProduct *pro in product)

{

NSLog(@"desc:%@", pro description);

NSLog(@"ltitle:%@", pro localizedTitle);

NSLog(@"ldesc:%@", pro localizedDescription);

NSLog(@"price:%@", pro price);

NSLog(@"identifier:%@", pro productIdentifier);

NSString* payName =@"--4.收到产品反馈消息---";

NSString *log = NSString stringWithFormat:@"%@%@%@%@%@%@",payName,\[pro description,pro localizedTitle,pro localizedDescription,pro price,pro productIdentifier];

NSString *string1 = @"--4. ";

NSString *string = pro.price stringValue;

NSString *result = string1 stringByAppendingString:string;

self PrintIOSLog:result;

}

// SKPayment *payment = SKPayment paymentWithProduct:product\[0];

// NSString* payName =@"--5.发送购买请求---";

// NSString* payName1 =@"--5.seng buy request---";

// self PrintIOSLog:payName1;

//

// \[SKPaymentQueue defaultQueue addPayment:payment];

NSLog(@"--------productsRequest 中 userId2: %@", self.userId2);

SKMutablePayment *payment = SKMutablePayment paymentWithProduct:product\[0];

// 设置用户关联信息

if (@available(iOS 13.0, *)) {

// 使用 NSInvocation 动态调用方法(更安全)

SEL selector = NSSelectorFromString(@"setAppAccountToken:");

if (payment respondsToSelector:selector) {

NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:

payment methodSignatureForSelector:selector];

invocation setTarget:payment;

invocation setSelector:selector;

NSData *tokenData = self.userId2 dataUsingEncoding:NSUTF8StringEncoding;

invocation setArgument:\&tokenData atIndex:2;

invocation invoke;

NSLog(@"成功设置 appAccountToken");

} else {

NSLog(@"---- appAccountToken");

// 回退到使用 applicationUsername

payment.applicationUsername = self.userId2;

}

} else {

// 旧版本使用 applicationUsername

payment.applicationUsername = self.userId2;

}

// 发送支付请求

\[SKPaymentQueue defaultQueue addPayment:payment];

}

//请求失败

  • (void)request:(SKRequest *)request didFailWithError:(NSError *)error

{

NSLog(@"------------------错误-----------------:%@", error);

self PrintIOSLog:@"--didFailWithError---";

}

//反馈信息结束

  • (void)requestDidFinish:(SKRequest *)request

{

NSString* payName =@"--6.反馈信息结束---";

NSString* payName1 =@"--6.requestDidFinish---";

self PrintIOSLog:payName1;

}

//监听购买结果

  • (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions

{

for(SKPaymentTransaction *transaction in transactions)

{

switch (transaction.transactionState)

{

case SKPaymentTransactionStatePurchased:

{

//交易结束

\[SKPaymentQueue defaultQueue finishTransaction:transaction];

NSURL *receiptUrl=\[NSBundle mainBundle appStoreReceiptURL];

NSData *receiptData=NSData dataWithContentsOfURL:receiptUrl;

NSLog(@"------ios----receipt data: %@", receiptData);

NSString *receiptString=receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed;//转化为base64字符串

NSLog(@"------ios-66666-7--receiptString: %@", receiptString);

// self PrintIOSLog:@"--9.交易结束---";

self PrintIOSLog:@"--9.finish over---";

mReceiptData = receiptString;

NSString *jsFunction = NSString stringWithFormat:@"CccToJS_ApplePay('%s')", mReceiptData.UTF8String;

wkwebView1 evaluateJavaScript:jsFunction completionHandler:nil;

}

break;

case SKPaymentTransactionStatePurchasing:

// self PrintIOSLog:@"--7.商品添加进列表---";

self PrintIOSLog:@"--7.product add list---";

break;

case SKPaymentTransactionStateRestored:

NSLog(@"已经购买过商品");

// self PrintIOSLog:@"------------已经购买过商品------------";

self PrintIOSLog:@"-----------10-SKPaymentTransactionStateRestored------------";

self restoreTransaction:transaction;

break;

case SKPaymentTransactionStateFailed:

NSLog(@"交易失败");

// UnitySendMessage("SdkMessager", "IOSPayCanceled", "");

//self PrintIOSLog:@"------------交易失败------------";

self PrintIOSLog:@"-----------11-SKPaymentTransactionStateFailed------------";

self failedTransaction:transaction;

break;

default:

break;

}

}

}

  • (void)restoreTransaction:(SKPaymentTransaction *)transaction

{

// ccjsbridge::excuteJS("CCToJsUtils", "CccToJS_ApplePay", "0");

NSString *str2=@"0";

NSString *jsFunction = NSString stringWithFormat:@"CccToJS_ApplePay('%s')", str2.UTF8String;

wkwebView1 evaluateJavaScript:jsFunction completionHandler:nil;

\[SKPaymentQueue defaultQueue finishTransaction: transaction];

}

//交易结束

  • (void)completeTransaction:(SKPaymentTransaction *)transaction

{

\[SKPaymentQueue defaultQueue finishTransaction:transaction];

}

//购买失败

  • (void)failedTransaction:(SKPaymentTransaction *)transaction

{

if(transaction.error.code != SKErrorPaymentCancelled)

{

}

else

{

//UnitySendMessage("SdkMessager", "IOSPayCanceled", "");

}

NSString *str2=@"0";

NSString *jsFunction = NSString stringWithFormat:@"CccToJS_ApplePay('%s')", str2.UTF8String;

wkwebView1 evaluateJavaScript:jsFunction completionHandler:nil;

\[SKPaymentQueue defaultQueue finishTransaction: transaction];

}

//验证receipt失败,App启动后再次验证

  • (void)sendFailedIapFiles

{

}

-(void)PrintIOSLog:(NSString*)logValue

{

//NSLog(@"------------------PrintIOSLog---------------logValue:%@", logValue);

//UnitySendMessage("SdkMessager", "IOSLog", logValue.UTF8String);

dispatch_async(dispatch_get_main_queue(), ^{

NSString *jsFunction = NSString stringWithFormat:@"CccToJS_LOG('%s')", logValue.UTF8String;

wkwebView1 evaluateJavaScript:jsFunction completionHandler:nil;

});

}

@end

相关推荐
jike_202615 分钟前
销售拜访记录APP推荐:客户沟通内容怎么快速整理?
ios·语音识别·iphone
00后程序员张3 小时前
iOS 开发全流程需要哪些工具?编码、调试、构建、发布阶段选择
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
游戏开发爱好者813 小时前
WebSocket 抓包怎么查看内容?从握手到消息帧完整解读
网络协议·计算机网络·网络安全·ios·adb·https·udp
悟空瞎说17 小时前
# Alamofire 使用文档 完整翻译
ios
weixin_531670891 天前
Interlude起来:久坐提醒软件为什么需要登录?有没有完全本地运行的Mac休息提醒软件?
人工智能·macos·swift
WeiAreYoung1 天前
Flutter+iOS 实现 Live Activity
flutter·ios
2501_916008891 天前
Swift多环境配置:利用Scheme实现灵活的多环境管理
开发语言·ide·vscode·ios·个人开发·swift·敏捷流程
00后程序员张1 天前
Windows / Linux / Mac 上不用 Xcode 把 IPA 上传到 App Store,upload 命令详解
android·ios·小程序·https·uni-app·iphone·webview
秦少游在淮海1 天前
id - Android、iOS
android·ios