精华内容
下载资源
问答
  • iOS苹果支付代码,内购和iOS 9 才能使用的苹果支付,代码简洁易懂
  • 苹果内购支付工具
  • 今天发现线上简影APP购买金币的功能在用户支付成功后未充金币成功,查看日志发现苹果把普通内购数据和会员订阅数据凭证放在一起返回了,导致存储凭证的字段长度超过设计长度,存储失败。印象中原先普通内购的凭证...

    今天发现线上简影APP购买金币的功能在用户支付成功后未充金币成功,查看日志发现苹果把普通内购数据和会员订阅数据凭证放在一起返回了,导致存储凭证的字段长度超过设计长度,存储失败。印象中原先普通内购的凭证解密后in_app中只有一条记录,直接取第一条处理就行;订阅的凭证解密后in_app一般会有多条记录(包括历次购买的),一般只会取最新的一条处理。

    原先金币购买的凭证解密后是这样的:

    {
        "receipt":{
            "receipt_type":"ProductionSandbox",
            "adam_id":0,
            "app_item_id":0,
            "bundle_id":"保密不能透露",
            "application_version":"3.53",
            "download_id":0,
            "version_external_identifier":0,
            "receipt_creation_date":"2019-12-25 04:00:41 Etc/GMT",
            "receipt_creation_date_ms":"1577246441000",
            "receipt_creation_date_pst":"2019-12-24 20:00:41 America/Los_Angeles",
            "request_date":"2019-12-25 04:00:44 Etc/GMT",
            "request_date_ms":"1577246444512",
            "request_date_pst":"2019-12-24 20:00:44 America/Los_Angeles",
            "original_purchase_date":"2013-08-01 07:00:00 Etc/GMT",
            "original_purchase_date_ms":"1375340400000",
            "original_purchase_date_pst":"2013-08-01 00:00:00 America/Los_Angeles",
            "original_application_version":"1.0",
            "in_app":[
                {
                    "quantity":"1",
                    "product_id":"com.jyys.jianmovie.35gold",
                    "transaction_id":"1000000608708592",
                    "original_transaction_id":"1000000608708592",
                    "purchase_date":"2019-12-25 04:00:41 Etc/GMT",
                    "purchase_date_ms":"1577246441000",
                    "purchase_date_pst":"2019-12-24 20:00:41 America/Los_Angeles",
                    "original_purchase_date":"2019-12-25 04:00:41 Etc/GMT",
                    "original_purchase_date_ms":"1577246441000",
                    "original_purchase_date_pst":"2019-12-24 20:00:41 America/Los_Angeles",
                    "is_trial_period":"false"
                }
            ]
        },
        "status":0,
        "environment":"Sandbox",
        "sandbox":"1"
    }

    现在普通内购凭证解密后变成这样的了:

    {
        "receipt":{
            "receipt_type":"Production",
            "adam_id":1326705989,
            "app_item_id":1326705989,
            "bundle_id":"保密不能透露",
            "application_version":"3.46",
            "download_id":30042550032613,
            "version_external_identifier":833263004,
            "receipt_creation_date":"2019-12-09 03:44:34 Etc/GMT",
            "receipt_creation_date_ms":"1575863074000",
            "receipt_creation_date_pst":"2019-12-08 19:44:34 America/Los_Angeles",
            "request_date":"2019-12-25 04:04:21 Etc/GMT",
            "request_date_ms":"1577246661522",
            "request_date_pst":"2019-12-24 20:04:21 America/Los_Angeles",
            "original_purchase_date":"2018-07-10 17:23:18 Etc/GMT",
            "original_purchase_date_ms":"1531243398000",
            "original_purchase_date_pst":"2018-07-10 10:23:18 America/Los_Angeles",
            "original_application_version":"1.7",
            "in_app":[
                {
                    "quantity":"1",
                    "product_id":"com.jyys.jianmovie.35gold",
                    "transaction_id":"100000613965493",
                    "original_transaction_id":"100000613965493",
                    "purchase_date":"2019-11-23 16:05:20 Etc/GMT",
                    "purchase_date_ms":"1574525120000",
                    "purchase_date_pst":"2019-11-23 08:05:20 America/Los_Angeles",
                    "original_purchase_date":"2019-11-23 16:05:20 Etc/GMT",
                    "original_purchase_date_ms":"1574525120000",
                    "original_purchase_date_pst":"2019-11-23 08:05:20 America/Los_Angeles",
                    "is_trial_period":"false"
                },
                {
                    "quantity":"1",
                    "product_id":"com.jyys.jianmovie.monthvipsubscription",
                    "transaction_id":"100000517858316",
                    "original_transaction_id":"100000517858316",
                    "purchase_date":"2019-02-03 23:33:02 Etc/GMT",
                    "purchase_date_ms":"1549236782000",
                    "purchase_date_pst":"2019-02-03 15:33:02 America/Los_Angeles",
                    "original_purchase_date":"2019-02-03 23:33:02 Etc/GMT",
                    "original_purchase_date_ms":"1549236782000",
                    "original_purchase_date_pst":"2019-02-03 15:33:02 America/Los_Angeles",
                    "is_trial_period":"false"
                },
                {
                    "quantity":"1",
                    "product_id":"com.jyys.jianmovie.monthvipsubscription",
                    "transaction_id":"100000527487209",
                    "original_transaction_id":"100000527487209",
                    "purchase_date":"2019-03-05 23:41:20 Etc/GMT",
                    "purchase_date_ms":"1551829280000",
                    "purchase_date_pst":"2019-03-05 15:41:20 America/Los_Angeles",
                    "original_purchase_date":"2019-03-05 23:41:20 Etc/GMT",
                    "original_purchase_date_ms":"1551829280000",
                    "original_purchase_date_pst":"2019-03-05 15:41:20 America/Los_Angeles",
                    "is_trial_period":"false"
                },
                {
                    "quantity":"1",
                    "product_id":"com.jyys.jianmovie.monthvipsubscription",
                    "transaction_id":"100000540745048",
                    "original_transaction_id":"100000540745048",
                    "purchase_date":"2019-04-17 04:08:21 Etc/GMT",
                    "purchase_date_ms":"1555474101000",
                    "purchase_date_pst":"2019-04-16 21:08:21 America/Los_Angeles",
                    "original_purchase_date":"2019-04-17 04:08:21 Etc/GMT",
                    "original_purchase_date_ms":"1555474101000",
                    "original_purchase_date_pst":"2019-04-16 21:08:21 America/Los_Angeles",
                    "is_trial_period":"false"
                },
                {
                    "quantity":"1",
                    "product_id":"com.jyys.jianmovie.monthvipsubscription",
                    "transaction_id":"100000550562750",
                    "original_transaction_id":"100000550562750",
                    "purchase_date":"2019-05-17 13:25:22 Etc/GMT",
                    "purchase_date_ms":"1558099522000",
                    "purchase_date_pst":"2019-05-17 06:25:22 America/Los_Angeles",
                    "original_purchase_date":"2019-05-17 13:25:22 Etc/GMT",
                    "original_purchase_date_ms":"1558099522000",
                    "original_purchase_date_pst":"2019-05-17 06:25:22 America/Los_Angeles",
                    "is_trial_period":"false"
                },
                {
                    "quantity":"1",
                    "product_id":"com.jyys.jianmovie.monthvipsubscription",
                    "transaction_id":"100000560413882",
                    "original_transaction_id":"100000560413882",
                    "purchase_date":"2019-06-17 10:40:47 Etc/GMT",
                    "purchase_date_ms":"1560768047000",
                    "purchase_date_pst":"2019-06-17 03:40:47 America/Los_Angeles",
                    "original_purchase_date":"2019-06-17 10:40:47 Etc/GMT",
                    "original_purchase_date_ms":"1560768047000",
                    "original_purchase_date_pst":"2019-06-17 03:40:47 America/Los_Angeles",
                    "is_trial_period":"false"
                },
                {
                    "quantity":"1",
                    "product_id":"com.jyys.jianmovie.monthvipsubscription",
                    "transaction_id":"100000571824950",
                    "original_transaction_id":"100000571824950",
                    "purchase_date":"2019-07-21 17:26:17 Etc/GMT",
                    "purchase_date_ms":"1563729977000",
                    "purchase_date_pst":"2019-07-21 10:26:17 America/Los_Angeles",
                    "original_purchase_date":"2019-07-21 17:26:17 Etc/GMT",
                    "original_purchase_date_ms":"1563729977000",
                    "original_purchase_date_pst":"2019-07-21 10:26:17 America/Los_Angeles",
                    "is_trial_period":"false"
                },
                {
                    "quantity":"1",
                    "product_id":"com.jyys.jianmovie.monthvipsubscription",
                    "transaction_id":"100000582063905",
                    "original_transaction_id":"100000582063905",
                    "purchase_date":"2019-08-21 05:50:22 Etc/GMT",
                    "purchase_date_ms":"1566366622000",
                    "purchase_date_pst":"2019-08-20 22:50:22 America/Los_Angeles",
                    "original_purchase_date":"2019-08-21 05:50:22 Etc/GMT",
                    "original_purchase_date_ms":"1566366622000",
                    "original_purchase_date_pst":"2019-08-20 22:50:22 America/Los_Angeles",
                    "is_trial_period":"false"
                },
                {
                    "quantity":"1",
                    "product_id":"com.jyys.jianmovie.monthvipsubscription",
                    "transaction_id":"100000600660696",
                    "original_transaction_id":"100000600660696",
                    "purchase_date":"2019-10-15 18:39:33 Etc/GMT",
                    "purchase_date_ms":"1571164773000",
                    "purchase_date_pst":"2019-10-15 11:39:33 America/Los_Angeles",
                    "original_purchase_date":"2019-10-15 18:39:33 Etc/GMT",
                    "original_purchase_date_ms":"1571164773000",
                    "original_purchase_date_pst":"2019-10-15 11:39:33 America/Los_Angeles",
                    "is_trial_period":"false"
                },
                {
                    "quantity":"1",
                    "product_id":"com.jyys.jianmovie.monthvipsubscription",
                    "transaction_id":"100000617153151",
                    "original_transaction_id":"100000617153151",
                    "purchase_date":"2019-12-02 05:34:02 Etc/GMT",
                    "purchase_date_ms":"1575264842000",
                    "purchase_date_pst":"2019-12-01 21:34:02 America/Los_Angeles",
                    "original_purchase_date":"2019-12-02 05:34:02 Etc/GMT",
                    "original_purchase_date_ms":"1575264842000",
                    "original_purchase_date_pst":"2019-12-01 21:34:02 America/Los_Angeles",
                    "is_trial_period":"false"
                }
            ]
        },
        "status":0,
        "environment":"Production"
    }

    最后又顺便检查了下订阅支付的凭证并无变化,附一条解密后的订阅支付的凭证样例:

    {
        "receipt":{
            "receipt_type":"Production",
            "adam_id":1326705989,
            "app_item_id":1326705989,
            "bundle_id":"保密不能透露",
            "application_version":"3.53",
            "download_id":30055199738257,
            "version_external_identifier":833862787,
            "receipt_creation_date":"2019-12-25 04:48:05 Etc/GMT",
            "receipt_creation_date_ms":"1577249285000",
            "receipt_creation_date_pst":"2019-12-24 20:48:05 America/Los_Angeles",
            "request_date":"2019-12-25 04:48:11 Etc/GMT",
            "request_date_ms":"1577249291367",
            "request_date_pst":"2019-12-24 20:48:11 America/Los_Angeles",
            "original_purchase_date":"2019-09-01 14:13:31 Etc/GMT",
            "original_purchase_date_ms":"1567347211000",
            "original_purchase_date_pst":"2019-09-01 07:13:31 America/Los_Angeles",
            "original_application_version":"2.91",
            "in_app":[
                {
                    "quantity":"1",
                    "product_id":"com.jyys.jianmovie.monthvipsubscription",
                    "transaction_id":"100000585820396",
                    "original_transaction_id":"100000585820396",
                    "purchase_date":"2019-09-01 14:24:33 Etc/GMT",
                    "purchase_date_ms":"1567347873000",
                    "purchase_date_pst":"2019-09-01 07:24:33 America/Los_Angeles",
                    "original_purchase_date":"2019-09-01 14:24:33 Etc/GMT",
                    "original_purchase_date_ms":"1567347873000",
                    "original_purchase_date_pst":"2019-09-01 07:24:33 America/Los_Angeles",
                    "is_trial_period":"false"
                },
                {
                    "quantity":"1",
                    "product_id":"com.jyys.jianmovie.monthvipsubscription",
                    "transaction_id":"100000597786700",
                    "original_transaction_id":"100000597786700",
                    "purchase_date":"2019-10-07 00:43:52 Etc/GMT",
                    "purchase_date_ms":"1570409032000",
                    "purchase_date_pst":"2019-10-06 17:43:52 America/Los_Angeles",
                    "original_purchase_date":"2019-10-07 00:43:52 Etc/GMT",
                    "original_purchase_date_ms":"1570409032000",
                    "original_purchase_date_pst":"2019-10-06 17:43:52 America/Los_Angeles",
                    "is_trial_period":"false"
                },
                {
                    "quantity":"1",
                    "product_id":"com.jyys.jianmovie.monthvipsubscription",
                    "transaction_id":"100000625254929",
                    "original_transaction_id":"100000625254929",
                    "purchase_date":"2019-12-25 04:48:05 Etc/GMT",
                    "purchase_date_ms":"1577249285000",
                    "purchase_date_pst":"2019-12-24 20:48:05 America/Los_Angeles",
                    "original_purchase_date":"2019-12-25 04:48:05 Etc/GMT",
                    "original_purchase_date_ms":"1577249285000",
                    "original_purchase_date_pst":"2019-12-24 20:48:05 America/Los_Angeles",
                    "is_trial_period":"false"
                }
            ]
        },
        "status":0,
        "environment":"Production"
    }

    如果有APP同时接普通内购(代表类型为充币)和订阅(代表类型为会员支付)的,要检查下其代码的兼容性了。

    展开全文
  • iOS微信支付 ios 微信支付 iOS微信支付 iOS集成微信支付 iOS 微信支付(客户端生成预支付订单) iOS-微信分享和支付) iOS支付宝支付 iOS 支付宝支付 ios 支付宝支付集成 ios 支付宝支付开发流程 2020AliPaySDK-...
    展开全文
  • 苹果内购支付对接

    2017-12-15 14:07:00
    publicboolValidateApplePay() { //客户端post过来的参数 stringappleReceipt=Request.Form["appleReceipt"];//苹果内购的验证收据 stringorderId=...
    1. public bool ValidateApplePay()  
    2.        {  
    3.                
    4.            //客户端post过来的参数  
    5.            string appleReceipt = Request.Form["appleReceipt"]; //苹果内购的验证收据  
    6.            string orderId = PayHelper.GetOrderIDByPrefix("AP");  //订单编号  
    7.            string amount = Request.Form["amount"];             //金额  
    8.            string userId = Request.Form["userId"];             //用户UserID  
    9.              
    10.            // 验证参数  
    11.            if (appleReceipt.Length < 20)  
    12.            {  
    13.                return false;  
    14.            }  
    15.   
    16.            string strJosn = string.Format("{{\"receipt-data\":\"{0}\"}}", appleReceipt);  
    17.            // 请求验证  
    18.            string strResult = CreatePostHttpResponse(strJosn, isSandbox);  
    19.            JObject obj = JObject.Parse(strResult);//using Newtonsoft.Json.Linq;  
    20.   
    21.            // 判断是否购买成功  
    22.            if (obj["status"].ToString() == "0")  
    23.            {  
    24.                return true;  
    25.            }  
    26.            else  
    27.            {  
    28.                return false;  
    29.            }  
    30.        }  
    31.    public string CreatePostHttpResponse(string datas, bool isSandbox = false)  
    32.        {  
    33.            //正式购买地址 沙盒购买地址  
    34.            string url_buy = "https://buy.itunes.apple.com/verifyReceipt";  
    35.            string url_sandbox = "https://sandbox.itunes.apple.com/verifyReceipt";  
    36.            string url = isSandbox ? url_sandbox : url_buy;  
    37.   
    38.            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;  
    39.            request.ProtocolVersion = HttpVersion.Version10;  
    40.            request.Method = "POST";  
    41.            request.ContentType = "application/x-www-form-urlencoded";  
    42.            byte[] data = Encoding.GetEncoding("UTF-8").GetBytes(datas.ToString());  
    43.            using (Stream stream = request.GetRequestStream())  
    44.            {  
    45.                stream.Write(data, 0, data.Length);  
    46.            }  
    47.   
    48.            HttpWebResponse response = request.GetResponse() as HttpWebResponse;  
    49.            Stream responseStream = response.GetResponseStream();   //获取响应的字符串流  
    50.            StreamReader sr = new StreamReader(responseStream); //创建一个stream读取流  
    51.            var str = sr.ReadToEnd();  
    52.            sr.Close();  
    53.            responseStream.Close();  
    54.            return str.ToString();  
    55.        }  

    转载于:https://www.cnblogs.com/morpheusliu/p/8042763.html

    展开全文
  • - (void)requestDidFinish:(SKRequest *)request{ NSLog(@"信息反馈结束"); } 这个方法都走了。没有请求失败。之前购买成功后 [[SKPaymentQueue defaultQueue] finishTransaction:tran]; 这个方法注释掉了 。...
  • 模式是使用RMB换成-金币比如:(1RMB = 10金币),所以会集成第三方的支付平台,使用了微信和支付宝的第三方平台过后,发现审核失败,被苹果拒绝,查了一查原因,才是因为苹果对app内的中间币的购买必须走苹果内购(比如冲点券...

    项目中使用到了中间货币(金币)的形式来进行功能使用,模式是使用RMB换成-金币比如:(1RMB = 10金币),所以会集成第三方的支付平台,使用了微信和支付宝的第三方平台过后,发现审核失败,被苹果拒绝,查了一查原因,才是因为苹果对app内的中间币的购买必须走苹果内购(比如冲点券,比如买钻石....)。所以无奈只有使用苹果内购,由于苹果内购的步骤很多,设置的东西太多,所以将这步骤记录下来。

    首先设置协议

    1.打开itunes Connect,选择协议,税务和银行业务

    image.png

    2.点击Request Contracts(申请合同)下面的,request,点了几个确定和下一步后回到主界面。

    image.png

    Contact info:联系人信息

    Bank info:银行信息

    Tax info:税务信息

    image.png

    3.首先设置联系人信息,点击Contact info下面的 Set up(设置),点击Add New Contract(增加先的联系方式)

    image.png

    4.填写详情

    填写完成后点击save(保存)

    image.png

    5.在下面的所有项目中都选择刚刚填写的信息,选择后点击右下角的done(完成),你可以创建很多联系人,在不同的职务选择不同的联系人。因为我是独立开发,所以我全部填写的我自己。

    Senior Management:高管

    Financial:财务

    Technical:技术支持

    Legal:法务

    Marketing:市场推广

    image.png

    6.设置银行信息,点击Back info下面的Set up,弹出页面

    点击Add Bank Account(添加银行账号)

    image.png

    选择china,后点击next。

    image.png

    填写了CNAPS Code后点击Next

    image.png

    会弹出你的银行卡开户地的信息,确认一下点击next

    image.png

    填写银行卡信息,注意:户主名只能写拼音,比如:李三(Li San)。填完后点击Next

    image.png

    弹出确定信息页面,在下面打钩后点击Save

    image.png

    点击了save后就可以在弹出的页面中选择刚刚填写的卡了。选择后点击Save

    image.png

    7.设置税务信息,点击Tax info下面的Set up,此时联系人信息已经变成可以编辑状态,银行信息为浏览状态。

    image.png

    弹出的界面中,税务分为三种

    U.S Tax Forms: 美国税务

    Australia Tax Forms:澳大利亚税务

    Canada Tax Forms: 加拿大税务

    这里我选择的美国税务,就是第一个

    image.png

    弹出第一个选择,点击submit(提交)后,弹出第二个选择

    image.png

    弹出第二个选择,选择后点击submit

    image.png

    弹出第三个页面,填写的资料后点击提交,记得勾选页面上的几个复选框

    image.png

    在提交成功后,状态就变成processing成功

    image.png

    到这里设置的协议就已经设置完了。

    创建项目的内购

    1.进入到项目的APP信息页面,点击功能,在弹出的页面点击App内购买项目后面的➕。

    image.png

    2.在弹出的新对话框中选择你需要哪一种服务,由于我的项目需要兑换成消耗的金币,所以我选择第一个。选择后点击创建。

    image.png

    3.开始填写内购项目信息。填完后点击右上角的存储(所有信息必须填写完整)。

    image.png

    4.点击存储后,内购列表就会有刚刚创建的内购条目。

    image.png

    你app有几个内购级别就需要依次创建几个条目。

    添加测试账号,用来测试支付功能

    1.点击图中用户和职能

    image.png

    2.点击沙盒测试员,然后点击左边的➕按钮。

    image.png

    3.设置好信息点击右上角存储就可以,记住里面的邮箱和密码用于支付的时候登陆Apple id

    image.png

    代码集成

    打开自己的项目,创建一个测试类。代码都有注释和步骤,直接上代码。

    注意:

    1.必须用真机测试。

    2.测试的时候必须退出自己的apple ID。弹出页面后登陆沙盒的测试apple id。

    #import "TestPayController.h"

    // 1.首先导入支付包

    #import

    // 2.设置代理服务

    @interface TestPayController ()

    @end

    @implementation TestPayController

    - (void)viewDidLoad {

    [super viewDidLoad];

    self.view.backgroundColor = [UIColor whiteColor];

    //3.创建测试按钮

    UIButton *testBtn = [[UIButton alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];

    testBtn.backgroundColor = [UIColor redColor];

    [testBtn addTarget:self action:@selector(clickTestBtnAction) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:testBtn];

    // 4.设置支付服务

    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];

    }

    //点击测试按钮

    - (void)clickTestBtnAction

    {

    // 5.点击按钮的时候判断app是否允许apple支付

    //如果app允许applepay

    if ([SKPaymentQueue canMakePayments]) {

    NSLog(@"yes");

    // 6.请求苹果后台商品

    [self getRequestAppleProduct];

    }

    else

    {

    NSLog(@"not");

    }

    }

    //请求苹果商品

    - (void)getRequestAppleProduct

    {

    // 7.这里的com.czchat.CZChat01就对应着苹果后台的商品ID,他们是通过这个ID进行联系的。

    NSArray *product = [[NSArray alloc] initWithObjects:@"com.czchat.CZChat01",nil];

    NSSet *nsset = [NSSet setWithArray:product];

    // 8.初始化请求

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

    request.delegate = self;

    // 9.开始请求

    [request start];

    }

    // 10.接收到产品的返回信息,然后用返回的商品信息进行发起购买请求

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

    {

    NSArray *product = response.products;

    //如果服务器没有产品

    if([product count] == 0){

    NSLog(@"nothing");

    return;

    }

    SKProduct *requestProduct = nil;

    for (SKProduct *pro in product) {

    NSLog(@"%@", [pro description]);

    NSLog(@"%@", [pro localizedTitle]);

    NSLog(@"%@", [pro localizedDescription]);

    NSLog(@"%@", [pro price]);

    NSLog(@"%@", [pro productIdentifier]);

    // 11.如果后台消费条目的ID与我这里需要请求的一样(用于确保订单的正确性)

    if([pro.productIdentifier isEqualToString:@"com.czchat.CZChat01"]){

    requestProduct = pro;

    }

    }

    // 12.发送购买请求

    SKPayment *payment = [SKPayment paymentWithProduct:requestProduct];

    [[SKPaymentQueue defaultQueue] addPayment:payment];

    }

    //请求失败

    - (void)request:(SKRequest *)request didFailWithError:(NSError *)error{

    NSLog(@"error:%@", error);

    }

    //反馈请求的产品信息结束后

    - (void)requestDidFinish:(SKRequest *)request{

    NSLog(@"信息反馈结束");

    }

    // 13.监听购买结果

    - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transaction{

    for(SKPaymentTransaction *tran in transaction){

    switch (tran.transactionState) {

    case SKPaymentTransactionStatePurchased:

    NSLog(@"交易完成");

    break;

    case SKPaymentTransactionStatePurchasing:

    NSLog(@"商品添加进列表");

    break;

    case SKPaymentTransactionStateRestored:

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

    [[SKPaymentQueue defaultQueue] finishTransaction:tran];

    break;

    case SKPaymentTransactionStateFailed:

    NSLog(@"交易失败");

    [[SKPaymentQueue defaultQueue] finishTransaction:tran];

    break;

    default:

    break;

    }

    }

    }

    // 14.交易结束,当交易结束后还要去appstore上验证支付信息是否都正确,只有所有都正确后,我们就可以给用户方法我们的虚拟物品了。

    - (void)completeTransaction:(SKPaymentTransaction *)transaction

    {

    NSString * str=[[NSString alloc]initWithData:transaction.transactionReceipt encoding:NSUTF8StringEncoding];

    NSString *environment=[self environmentForReceipt:str];

    NSLog(@"----- 完成交易调用的方法completeTransaction 1--------%@",environment);

    // 验证凭据,获取到苹果返回的交易凭据

    // appStoreReceiptURL iOS7.0增加的,购买交易完成后,会将凭据存放在该地址

    NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];

    // 从沙盒中获取到购买凭据

    NSData *receiptData = [NSData dataWithContentsOfURL:receiptURL];

    /**

    20      BASE64 常用的编码方案,通常用于数据传输,以及加密算法的基础算法,传输过程中能够保证数据传输的稳定性

    21      BASE64是可以编码和解码的

    22      */

    NSString *encodeStr = [receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];

    NSString *sendString = [NSString stringWithFormat:@"{\"receipt-data\" : \"%@\"}", encodeStr];

    NSLog(@"_____%@",sendString);

    NSURL *StoreURL=nil;

    if ([environment isEqualToString:@"environment=Sandbox"]) {

    StoreURL= [[NSURL alloc] initWithString: @"https://sandbox.itunes.apple.com/verifyReceipt"];

    }

    else{

    StoreURL= [[NSURL alloc] initWithString: @"https://buy.itunes.apple.com/verifyReceipt"];

    }

    //这个二进制数据由服务器进行验证;zl

    NSData *postData = [NSData dataWithBytes:[sendString UTF8String] length:[sendString length]];

    NSLog(@"++++++%@",postData);

    NSMutableURLRequest *connectionRequest = [NSMutableURLRequest requestWithURL:StoreURL];

    [connectionRequest setHTTPMethod:@"POST"];

    [connectionRequest setTimeoutInterval:50.0];//120.0---50.0zl

    [connectionRequest setCachePolicy:NSURLRequestUseProtocolCachePolicy];

    [connectionRequest setHTTPBody:postData];

    //开始请求

    NSError *error=nil;

    NSData *responseData=[NSURLConnection sendSynchronousRequest:connectionRequest returningResponse:nil error:&error];

    if (error) {

    NSLog(@"验证购买过程中发生错误,错误信息:%@",error.localizedDescription);

    return;

    }

    NSDictionary *dic=[NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingAllowFragments error:nil];

    NSLog(@"请求成功后的数据:%@",dic);

    //这里可以等待上面请求的数据完成后并且state = 0 验证凭据成功来判断后进入自己服务器逻辑的判断,也可以直接进行服务器逻辑的判断,验证凭据也就是一个安全的问题。楼主这里没有用state = 0 来判断。

    //  [[SKPaymentQueue defaultQueue] finishTransaction: transaction];

    NSString *product = transaction.payment.productIdentifier;

    NSLog(@"transaction.payment.productIdentifier++++%@",product);

    if ([product length] > 0)

    {

    NSArray *tt = [product componentsSeparatedByString:@"."];

    NSString *bookid = [tt lastObject];

    if([bookid length] > 0)

    {

    NSLog(@"打印bookid%@",bookid);

    //这里可以做操作吧用户对应的虚拟物品通过自己服务器进行下发操作,或者在这里通过判断得到用户将会得到多少虚拟物品,在后面([self getApplePayDataToServerRequsetWith:transaction];的地方)上传上面自己的服务器。

    }

    }

    //此方法为将这一次操作上传给我本地服务器,记得在上传成功过后一定要记得销毁本次操作。调用[[SKPaymentQueue defaultQueue] finishTransaction: transaction];

    [self getApplePayDataToServerRequsetWith:transaction];

    }

    //结束后一定要销毁

    - (void)dealloc

    {

    [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];

    }

    - (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    }

    -(NSString * )environmentForReceipt:(NSString * )str

    {

    str= [str stringByReplacingOccurrencesOfString:@"\r\n" withString:@""];

    str = [str stringByReplacingOccurrencesOfString:@"\n" withString:@""];

    str = [str stringByReplacingOccurrencesOfString:@"\t" withString:@""];

    str=[str stringByReplacingOccurrencesOfString:@" " withString:@""];

    str=[str stringByReplacingOccurrencesOfString:@"\"" withString:@""];

    NSArray * arr=[str componentsSeparatedByString:@";"];

    //存储收据环境的变量

    NSString * environment=arr[2];

    return environment;

    }

    @end

     

    展开全文
  • apicloud含有微信支付。支付宝支付苹果内购的代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="maximum-scale=1.0,m...
  • 苹果支付是直接由ios客户端调起苹果支付并支付完成后,java后台提供一个支付回调接口供ios客户端进行同步回调,只需要在该接口进行进行验证苹果支付是否支付成功,跟微信支付和支付宝支付不一样,不需要统一下单接口...
  • 大体流程:1.IOS端需要在iTunes Connect上面添加配置一些内购商品,并审核通过,每个内购商品有自己的唯一标识product_id。...如下在tp5的config中做了配置://IOS内购配置'applepay'=>['bundle_id'=>...
  • php 苹果内购支付

    千次阅读 2017-11-18 16:25:49
     * 验证AppStore付   * @param string $receipt_data 付款后凭证   * @return array 验证是否成功   */  function validate_apple_pay($receipt_data){   /**   * 21000 App Store...
  • APP苹果内购支付

    2018-07-03 11:37:28
    $user_id = $_SESSION['user_id'];/* = 1024 */ if ($user_id &lt;= 0) { return new ecjia_error(100, 'Invalid session');...https://buy.itunes.apple.com/verifyReceipt"; $url_sandbox =...
  • 苹果IAP内购支付实际上是"将客户端支付后的一些信息传给后台, 后台拿着这些信息在传给苹果支付平台, 来验证客户端支付是否有效"的一个过程, 中间的难点有三个.一是沙盒测试数据和线上测试数据的问题. 刚开始接入苹果...
  • php苹果内购支付验证

    2019-06-25 16:29:58
    * 验证AppStore付 * @param string $receipt_data 付款后凭证 * @return array 验证是否成功 */ function validate_apple_pay($receipt_data){ /** * 21000 App Store不能读取你提供的JSON对象 * 21...
  • 苹果支付(内购项目)回调验证

    千次阅读 2020-02-20 17:00:09
    参考: https://blog.csdn.net/fangdong88/article/details/82698810?utm_source=distribute.pc_relevant.none-task ... 官方文件: https://developer.apple.com/lib...
  • 苹果内购:只要你在苹果系统购买APP中虚拟物品(虚拟货币,VIP充值等),必须通过内购方式进行支付苹果和商家进行三七开验证模式有两种:Validating Receipts With the App Store 通过访问苹果接口进行验证。...
  • * 苹果支付 */ public class IosPalUtils { /** * @param key 支付Id第三方返回的orderId */ public static Boolean isSuccess(String key) { try { Boolean ok=false; if (key!=null) {
  • 苹果内购支付 服务器端验证

    千次阅读 2017-12-19 11:56:28
    /** * 客户端支付完后调用的接口 * 验证通过后 做后续业务逻辑处理 */ public function payendtovalidate() { $receipt_data=isset($_POST['receipt_data']) ? $_POST['receipt_data'] : '';//待验证数据 ...
  • 苹果内购

    2017-05-02 17:05:30
    内购简介: 在APP里面购买一些东西的时候,必须要使用苹果支付方式进行...2.从用户角度来看,内购支付,第一次需要绑定银行卡 操作流程相对来说比较复杂 3.内购商品的价格,不能自定义,只有固定的级别. 下面是内购的操...
  • PHP 苹果内购支付正式验证地址: https://buy.itunes.apple.com/verifyReceipt沙盒验证地址: https://sandbox.itunes.apple.com/verifyReceipt/*** 苹果内购Api查询接口* Class AppleAipController* @package Pay\...
  • 出现上面的提示时,我们首先需要从自己“可控”的范围查找原因。一、未越狱系统1、检查下自己的Apple ID是否有足够余额。2、中国大陆地区Apple ID账号,检查自己的银行卡设置信息,如果绑定的是信用卡。再次检查...
  • iOS内购代码(苹果支付ApplePay)

    千次阅读 2019-02-26 14:21:04
    刚刚做了内购, 记录一下 这里直接上代码, 至于写代码之前的一些设置工作参考以下文章:http://www.jianshu.com/p/690a7c68664ehttp://www.jianshu.com/p/86ac7d3b593a 需要注意的是: 只要工程配置了对应的证书, 就...
  • 1, 做内购订阅,苹果要求,匿名购买与服务端交流,为了保持业务逻辑。采用游客匿名账户。游客匿名账户与正常账户的区别是,游客匿名账户,可以正常搞 IAP,不挡着苹果挣钱。游客匿名账户,要做其他个人中心的操作,...
  • use sn01615\iap\ios\Verify;include "../vendor/autoload.php";$cc = new Verify();$receipt = ".."; // 凭据$cc->endpoint(true);// 可选,切换到沙盒环境$cc->setPassword('123');...setExcludeO...
  • 转载于:https://www.cnblogs.com/hjjun/p/7070575.html
  • 应用内有的视频需要购买才能观看,支付必须要走苹果内购吗? 可以只集成微信或者支付宝通过审核吗? 急!!
  • 最近看到很多人在网上询问关于Apple应用内购的服务端验证问题,之前实现了一个PHP版本的封装,今天整理一下,记录在这里,供需要的朋友参考,注意,这里是PHP版本,其他语言验证方式一样,请自行实现:前提:1、App...
  • 苹果IAP内购支付实际上是"将客户端支付后的一些信息传给后台, 后台拿着这些信息在传给苹果支付平台, 来验证客户端支付是否有效"的一个过程, 中间的难点有三个. 一是沙盒测试数据和线上测试数据的问题. 刚开始接入...
  • 该商品标识是在控制器的initWithNibName方法,请求server拿到的一系列商品标识(该标识是事先在iTunes Connect –>我的App–>App内购项目内设置的) 拿到该标识,去和苹果交互 - ( void )...

空空如也

空空如也

1 2 3 4 5 ... 18
收藏数 343
精华内容 137
关键字:

苹果支付内购