彭成万李 發表於 2019-6-8 20:25:00

iOS开发支付篇——内购(IAP)详解

<h1 class="postTitle">&nbsp;</h1>
<div class="postBody">
<div id="cnblogs_post_body" class="blogpost-body">
<div class="cnblogs_Highlighter">
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_126413" class="syntaxhighlightercsharp">
<table style="margin-left: 30px" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="csharp plain">&lt;em&gt;内购所需要的资料整理总结,史上最完整的,哈哈哈哈哈哈&lt;/em&gt;</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<p><strong>思维导图</strong></p>
<p><strong><img src="https://images2015.cnblogs.com/blog/809476/201705/809476-20170525194948388-774343317.png"></strong></p>
<p><strong>重点总结:</strong></p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_68433" class="syntaxhighlightercsharp">
<table style="margin-left: 30px" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="csharp plain">1.获取内购列表(从App内读取或从自己服务器读取)</code></div>
<div class="line number2 index1 alt1"><code class="csharp plain">2.App Store请求可用的内购列表</code></div>
<div class="line number3 index2 alt2"><code class="csharp plain">3.向用户展示内购列表</code></div>
<div class="line number4 index3 alt1"><code class="csharp plain">4.用户选择了内购列表,再发个购买请求,收到购买完成的回调(购买完成后会把钱打给申请内购的银行卡内)</code></div>
<div class="line number5 index4 alt2"><code class="csharp plain">5.购买流程结束后, 向服务器发起验证凭证以及支付结果的请求</code></div>
<div class="line number6 index5 alt1"><code class="csharp plain">6.自己的服务器将支付结果信息返回给前端并发放虚拟产品</code></div>
<div class="line number7 index6 alt2"><code class="csharp plain">7.服务端的工作比较简单,分4步:</code></div>
<div class="line number8 index7 alt1"><code class="csharp plain">  7.1.接收ios端发过来的购买凭证。</code></div>
<div class="line number9 index8 alt2"><code class="csharp plain">  7.2.判断凭证是否已经存在或验证过,然后存储该凭证。</code></div>
<div class="line number10 index9 alt1"><code class="csharp plain">  7.3.将该凭证发送到苹果的服务器验证,并将验证结果返回给客户端。</code></div>
<div class="line number11 index10 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">7.4.如果需要,修改用户相应的会员权限。</code></div>
<div class="line number12 index11 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">7.5.考虑到网络异常情况,服务器的验证应该是一个可恢复的队列,如果网络失败了,应该进行重试。</code></div>
<div class="line number13 index12 alt2"><code class="csharp plain">简单来说就是将该购买凭证用Base64编码,然后POST给苹果的验证服务器,苹果将验证结果以JSON形式返回。</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p><strong>一、使用注意事项及遇到的坑</strong></p>
<p><strong>  1.使用注意</strong></p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_418158" class="syntaxhighlightercsharp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="csharp plain">1. 代码中的_currentProId所填写的是你的购买项目的的ID,这个和第二步创建的内购的productID要一致,产品id与_currentProId一致。</code></div>
<div class="line number2 index1 alt1"><code class="csharp plain">2. 在监听购买结果后,一定要调用[ finishTransaction:tran];来允许你从支付队列中移除交易。</code></div>
<div class="line number3 index2 alt2"><code class="csharp plain">3. 真机测试的时候,一定要退出原来的账号(app store 登录的账号退出),才能用沙盒测试账号。</code></div>
<div class="line number4 index3 alt1"><code class="csharp plain">4. 请务必使用真机来测试,一切以真机为准。</code></div>
<div class="line number5 index4 alt2"><code class="csharp plain">5. 项目的Bundle identifier需要与您申请AppID时填写的bundleID一致,不然会无法请求到商品信息。</code></div>
<div class="line number6 index5 alt1"><code class="csharp plain">6. 沙盒环境测试appStore内购流程的时候,请使用没越狱的设备。</code></div>
<div class="line number7 index6 alt2"><code class="csharp plain">7. 二次验证,请注意区分宏, 测试用沙盒验证,App Store审核的时候也使用的是沙盒购买,所以验证购买凭证的时候需要判断返回Status Code决定是否去沙盒进行二次验证,为了线上用户的使用,验证的顺序肯定是先验证正式环境,此时若返回值为21007,就需要去沙盒二次验证,因为此购买的是在沙盒进行的。</code></div>
<div class="line number8 index7 alt1"><code class="csharp plain">8.货币类型(Bank Account Currency) :填CNY(如果你的app在中国使用的话)。</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>  2.获取不到商品信息</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_276239" class="syntaxhighlightercsharp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="csharp plain">1.确定配置环节正确。</code></div>
<div class="line number2 index1 alt1"><code class="csharp plain">2.确定是真机测试且手机没有越狱。</code></div>
<div class="line number3 index2 alt2"><code class="csharp plain">3.确定内购商品添加到了需要内购功能的App中。</code></div>
<div class="line number4 index3 alt1"><code class="csharp plain">4.确定当前运行的App的Bundle ID和后台配置的App的Bundle ID是一致的。</code></div>
<div class="line number5 index4 alt2"><code class="csharp plain">5.可以尝试先删除旧App,再重新编译生成新的,避免新App未覆盖错误。</code></div>
<div class="line number6 index5 alt1"><code class="csharp plain">6.这里要提一点,沙盒的测试账号和你请求商品信息没有关系。请求商品信息的流程是,你在后台配置好了内购商品,并且将其添加到了需要集成内购功能的App中,然后你请求商品。请求到商品后的流程是这样的,苹果系统会自动弹出登录框让你登录账号。然后根据提示操作进行购买,这里的账号就是你配置的沙盒测试账号。</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p><strong>二、为什么要使用内购?(why)和内购是什么?(what)</strong></p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_219159" class="syntaxhighlightercsharp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="csharp plain">  1.如果你购买的商品,是在本app中使用和消耗的,就一定要用内购,否则会被拒绝上线,例如:游戏币,在线书籍</code></div>
<div class="line number2 index1 alt1"><code class="csharp plain">app中使用的道具等。本例中,就是直播中你用来打赏用的金币,那东西可就属于消耗型的。</code></div>
<div class="line number3 index2 alt2"><code class="csharp plain">  2.如果是直接购买商城之类的快递包邮的那些东东,那就直接调用支付宝,微信啦,之类的三方支付就好了,淘宝,京东都玩过哈!</code></div>
<div class="line number4 index3 alt1"><code class="csharp plain">比较坑的一点就是,内购的话,还要和苹果3/7分成,那就可以说,充值相同的钱,相对来说,iOS是比安卓亏的!</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p><strong>三、怎样使用内购?(how)</strong></p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_720000" class="syntaxhighlightercsharp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="csharp plain">  1.使用内购需要哪些资料&lt;br&gt;  &nbsp;&nbsp; 1张visa银行卡,appid,1张银行卡与苹果三七分打钱用</code></div>
<div class="line number2 index1 alt1"><code class="csharp plain">    (1)协议、税务和银行业务</code></div>
<div class="line number3 index2 alt2"><code class="csharp plain">       联系人信息:(appid账号人)姓名,邮箱,电话号码,地址(城市、具体街道分行写)</code></div>
<div class="line number4 index3 alt1"><code class="csharp plain">       visa银行卡信息:开户行,开户行所在地址,开户行的邮政编码,开户行持有人卡号,开户行持有人姓名</code></div>
<div class="line number5 index4 alt2"><code class="csharp plain">       税务信息:1.会问你是不是美国居民选择NO.&nbsp; 2. 有没有在美国从事商业性活动,选择NO. 之后填写个人或组织名称,所在国家,受益方式(独立开发者选择个人),居住地址,邮寄地址,声明人,头衔</code></div>
<div class="line number6 index5 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">(2)内购产品id的配置 (开发人员配置)</code></div>
<div class="line number7 index6 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">如果是金币或其它消耗品的产品的话用消耗性型项目,参考名称(内购项目,比如金币100),产品id,定价信息,使用内购的快照,显示名称,描述。</code></div>
<div class="line number8 index7 alt1"><code class="csharp plain">    (3)用户职能</code></div>
<div class="line number9 index8 alt2"><code class="csharp plain">      测试员:添加水箱测试员及沙箱账号,水箱测试账号不能是正常使用的appid账号,直接使用一个没有注册过的邮箱账号即可。</code></div>
<div class="line number10 index9 alt1"><code class="csharp plain">姓名,测试账号密码,appstore地区(必须填对)。</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p><strong>四、操作流程图解与代码</strong></p>
<p>&nbsp;&nbsp;<strong>1.创建app后填写用户信息</strong></p>
<p><img src="https://images2015.cnblogs.com/blog/809476/201705/809476-20170515141841541-401399985.png"></p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_21936" class="syntaxhighlightercsharp">
<table style="margin-left: 30px" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="csharp plain">功能简介 :</code></div>
<div class="line number2 index1 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">1.我的App主要用于管理自己的App应用,例如编辑资料,上架,下架等。</code></div>
<div class="line number3 index2 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">2.销售和趋势主要是来查看App在各个平台的下载量,收入等方面数据,里面有曲线图等图文结合的方式给我们参考。</code></div>
<div class="line number4 index3 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">3.付款和财务报告显示的是你的收入以及付款等相关信息。</code></div>
<div class="line number5 index4 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">4.iAd主要是跟广告有关,开发者可以登录到Workbench,通过iAd对应用的广告进行控制。</code></div>
<div class="line number6 index5 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">5.用户和职能用于生成相应账号,例如苹果沙盒测试账号。</code></div>
<div class="line number7 index6 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">6.协议,税务和银行业务则是你银行相关账户的信息设置。</code></div>
<div class="line number8 index7 alt1"><code class="csharp plain">流程</code></div>
<div class="line number9 index8 alt2"><code class="csharp spaces">&nbsp;</code><code class="csharp plain">1.注册app,填写协议、税务和银行业务</code></div>
<div class="line number10 index9 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">注册app,需要设置Bundle identifier,此个步骤这里就不在写了</code></div>
<div class="line number11 index10 alt2"><code class="csharp spaces">&nbsp;&nbsp;</code><code class="csharp plain">填写协议、税务和银行业务</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>  <img src="https://images2015.cnblogs.com/blog/809476/201705/809476-20170515135546119-72085241.png"></p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_169667" class="syntaxhighlightercsharp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="csharp plain">&lt;strong&gt;选择申请合同类型&lt;/strong&gt;</code></div>
<div class="line number2 index1 alt1"><code class="csharp plain">页面内容:</code></div>
<div class="line number3 index2 alt2"><code class="csharp plain">Request Contracts(申请合同)</code></div>
<div class="line number4 index3 alt1"><code class="csharp plain">Contracts In Effect(已生效合同)。</code></div>
<div class="line number5 index4 alt2"><code class="csharp plain">合同类型:</code></div>
<div class="line number6 index5 alt1"><code class="csharp plain">iOS Free Application(免费应用合同)</code></div>
<div class="line number7 index6 alt2"><code class="csharp plain">iOS Paid Application(付费应用合同)</code></div>
<div class="line number8 index7 alt1"><code class="csharp plain">iAd App NetNetwork(广告合同)</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p><strong>  1.申请iOS Paid Application合同</strong></p>
<p><img src="https://images2015.cnblogs.com/blog/809476/201705/809476-20170515140120182-1550945803.png"></p>
<p><strong><img src="https://images2015.cnblogs.com/blog/809476/201705/809476-20170515140734791-1131478044.png"></strong></p>
<p><strong> 2. 设置协议税务、银行卡信息</strong></p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_445465" class="syntaxhighlightercsharp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="csharp plain">当我们点击申请iOS Paid Application合同后,该合同的状态会变成如下的样子,我们可以看到其中Status为Contact, Bank, Pending Tax,</code></div>
<div class="line number2 index1 alt1"><code class="csharp plain">意思是联系方式、银行和税务信息没有填写。</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p> <img src="https://images2015.cnblogs.com/blog/809476/201705/809476-20170515141034307-571797047.png"></p>
<p>&nbsp;2.1设置联系人信息</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_964841" class="syntaxhighlightercsharp">
<table style="margin-left: 30px" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="csharp plain">如果你没有添加过联系人,你需要通过Add New Contact按钮来添加一个新的联系人。然后指定联系人的职务,职务如下:</code></div>
<div class="line number2 index1 alt1"><code class="csharp plain">Senior Management:高管</code></div>
<div class="line number3 index2 alt2"><code class="csharp plain">Financial:财务</code></div>
<div class="line number4 index3 alt1"><code class="csharp plain">Technical:技术支持</code></div>
<div class="line number5 index4 alt2"><code class="csharp plain">Legal:法务</code></div>
<div class="line number6 index5 alt1"><code class="csharp plain">Marketing:市场推广</code></div>
<div class="line number7 index6 alt2"><code class="csharp plain">如果你是独立开发者,可以全部填你自己一个人。</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>&nbsp; 新增联系人</p>
<p><img src="https://images2015.cnblogs.com/blog/809476/201705/809476-20170515141553478-2078608055.png"></p>
<p>&nbsp; 通过新增或之前增加的联系人设置高管等信息</p>
<p>  <img src="https://images2015.cnblogs.com/blog/809476/201705/809476-20170515141703697-1238312823.png"></p>
<p>待完成后点击Done,返回后状态会变成Edit状态</p>
<p>&nbsp;2.2设置银行卡信息(可以通过银行名称和地址直接上网查询CNAPS Code号,不要问我上那查)</p>
<p>&nbsp;</p>
<p><img src="https://images2015.cnblogs.com/blog/809476/201705/809476-20170515142533994-1905263353.png"></p>
<p><img src="https://images2015.cnblogs.com/blog/809476/201705/809476-20170515142607228-475558610.png">  </p>
<p>确认银行卡信息</p>
<p><img src="https://images2015.cnblogs.com/blog/809476/201705/809476-20170515142657978-12880118.png"></p>
<p><img src="https://images2015.cnblogs.com/blog/809476/201705/809476-20170525195314513-1244311328.png"></p>
<p>&nbsp;</p>
<p>&nbsp;2.3设置税务信息(1.是美国税务,只需要这个就行,后面的澳大利亚和日本的和我们没的关系)</p>
<p><img src="https://images2015.cnblogs.com/blog/809476/201705/809476-20170515142909697-1847363532.png"></p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_356710" class="syntaxhighlightercsharp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="csharp plain">选择U.S Tax Forms,选择后会问你两个问题,第一个问题如下:询问你是否是美国居民,有没有美国伙伴关系或者美国公司,如果没有直接选择No。</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p><img src="https://images2015.cnblogs.com/blog/809476/201705/809476-20170515143005838-216592831.png"></p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_240843" class="syntaxhighlightercsharp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="csharp plain">接下来第二个问题如下:询问你有没有在美国的商业性活动,没有也直接选No。</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p><img src="https://images2015.cnblogs.com/blog/809476/201705/809476-20170515143058166-1418447491.png"></p>
<p>然后填写税务信息</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_254544" class="syntaxhighlightercsharp">
<table style="margin-left: 30px" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="csharp plain">然后填写你的税务信息,包括以下几点:</code></div>
<div class="line number2 index1 alt1">&nbsp;</div>
<div class="line number3 index2 alt2"><code class="csharp plain">Individual or Organization Name:个人或者组织名称</code></div>
<div class="line number4 index3 alt1"><code class="csharp plain">Country of incorporation: 所在国家</code></div>
<div class="line number5 index4 alt2"><code class="csharp plain">Type of Beneficial Owner:受益方式,独立开发者选个人</code></div>
<div class="line number6 index5 alt1"><code class="csharp plain">Permanent Residence:居住地址</code></div>
<div class="line number7 index6 alt2"><code class="csharp plain">Mailing address:邮寄地址</code></div>
<div class="line number8 index7 alt1"><code class="csharp plain">Name of Person Making&nbsp;</code><code class="csharp keyword">this</code>&nbsp;<code class="csharp plain">Declaration:声明人</code></div>
<div class="line number9 index8 alt2"><code class="csharp plain">Title:头衔</code></div>
<div class="line number10 index9 alt1"><code class="csharp plain">当你填写完所有资料后,合同状态就会变成Processing,笔者凌晨1点左右提交,下午就通过了。</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>  具体填写见下图(以下是确认税务信息图)</p>
<p><img src="https://images2015.cnblogs.com/blog/809476/201705/809476-20170525155758107-1913127238.png"></p>
<p>  <strong>填写完成后效果</strong></p>
<p><strong><img src="https://images2015.cnblogs.com/blog/809476/201705/809476-20170525195354185-1850607271.png"></strong></p>
<p><strong>&nbsp;3.配置内购产品ID</strong></p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_414635" class="syntaxhighlightercsharp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="csharp plain">完成以上操作,并且苹果审核完毕之后,就可以配置内购产品了。</code></div>
<div class="line number2 index1 alt1"><code class="csharp plain">登录 iTunesConnect --&gt;我的App 模块找到需要内购的App,最后找到页面如下:</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>  <img src="https://images2015.cnblogs.com/blog/809476/201705/809476-20170515144038807-887409030.png"></p>
<p><img src="https://images2015.cnblogs.com/blog/809476/201705/809476-20170515144059432-1391665590.png"></p>
<p><img src="https://images2015.cnblogs.com/blog/809476/201705/809476-20170515144122291-768305852.png"></p>
<p><img src="https://images2015.cnblogs.com/blog/809476/201705/809476-20170515144133666-677049088.png"></p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_72159" class="syntaxhighlightercsharp">
<table style="margin-left: 30px" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="csharp plain">填写沙箱测试员和添加内购产品注意事项</code></div>
<div class="line number2 index1 alt1"><code class="csharp plain">1、邮箱必须是没有注册或者说关联过appstore的邮箱。</code></div>
<div class="line number3 index2 alt2"><code class="csharp plain">2、密码必须有一个是大写字母有一个是小写字母(苹果规定的,理解)。</code></div>
<div class="line number4 index3 alt1"><code class="csharp plain">3、内购屏幕截图规格必须是312*290,且最低分辨率是72ppi。</code></div>
<div class="line number5 index4 alt2"><code class="csharp plain">4、内购的价格是苹果规定的不能自定义(坑啊)。</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p><strong>4.增加内购测试账号</strong></p>
<p><strong>&nbsp; &nbsp; &nbsp;4.1 内购测试之前准备</strong></p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_577681" class="syntaxhighlightercsharp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="csharp plain">1、什么是内购测试账号(what)及为什么使用内购测试账号(why)?</code></div>
<div class="line number2 index1 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">iOS应用里面用到了苹果应用内付费(IAP)功能,在项目上线前一定要进行功能测试。测试肯定是需要的,何况这个跟money有关。。。开发完成了之后,如何进行测试呢?难道我测试个内购功能要自己掏钱?就算是也是公司掏钱,但是苹果要吃掉3成的啊,想想如果是99刀的商品,点下购买的时候心里都有点发慌。。。</code></div>
<div class="line number3 index2 alt2"><code class="csharp plain">苹果当然没这么坑了,测试内购,苹果提供了沙盒账号(也叫沙箱账号)的方式。这个沙箱账号其实是虚拟的AppleID,在开发者账号后台的iTune Connect上配置了之后就能使用沙盒账号测试内购,有了沙盒账号,就能体验一把土豪的感觉了,游戏钻石什么的随便充,反正不用我的钱。</code></div>
<div class="line number4 index3 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">注意:你可以把沙盒账号看做是一个虚拟的AppleID,这个AppleID只有进行内购测试的功能。重要,重要,重要,这个虚拟的账号只能在自己的测试号中使用,如果在其它地方如appstore使用的话会提示账号无效之类的话。&nbsp;&nbsp;&nbsp;</code></div>
<div class="line number5 index4 alt2">&nbsp;</div>
<div class="line number6 index5 alt1"><code class="csharp plain">2、如何使用内购测试账号(how)?</code></div>
<div class="line number7 index6 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">2.1作用内购账号的前提</code></div>
<div class="line number8 index7 alt1"><code class="csharp plain">1)内购的商品ID,价格等相关信息已经录入到开发者后台了(不然那你买什么)</code></div>
<div class="line number9 index8 alt2"><code class="csharp plain">2)开发者后台已经创建好沙盒测试账号了(下面我们会将如何创建)</code></div>
<div class="line number10 index9 alt1"><code class="csharp plain">3)你要有一部真机(iPhone或iPad都行,别用模拟器就好。而且不能是越狱机)</code></div>
<div class="line number11 index10 alt2"><code class="csharp plain">4)bundleID别搞错了,开发者账号、证书、bundleID要一致</code></div>
<div class="line number12 index11 alt1"><code class="csharp plain">5)如果你是第一次在这个开发者账号上集成内购功能,</code></div>
<div class="line number13 index12 alt2"><code class="csharp plain">请先将iTune Connect上的税务协议都填写好,否则内购时会发现商品ID无效。</code></div>
<div class="line number14 index13 alt1"><code class="csharp spaces">&nbsp;</code><code class="csharp plain">重要,如果不添加税务协议会报错,找不到商品。</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>  选择用户和职能就是在协议、税务和银行业务左侧</p>
<p><img src="https://images2015.cnblogs.com/blog/809476/201705/809476-20170515144413385-1487783901.png"></p>
<p><img src="https://images2015.cnblogs.com/blog/809476/201705/809476-20170515144429588-2128945489.png"></p>
<p>&nbsp;  <strong>4.2内购测试开始</strong></p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_869347" class="syntaxhighlightercsharp">
<table style="margin-left: 30px" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="csharp plain">1.在iPhone上安装测试包(必须是打包签名证书或者develop签名证书打的包,不能是从App Store上下载的)</code></div>
<div class="line number2 index1 alt1"><code class="csharp plain">2.退出iPhone的App Store账号(因为我们需要使用沙盒账号登录)。</code></div>
<div class="line number3 index2 alt2"><code class="csharp plain">操作方法一:打开App Store应用首页滑到最下方--选中AppleID--注销</code></div>
<div class="line number4 index3 alt1"><code class="csharp plain">操作方法二:设置--iTunes Store与App Store--选中AppleID--注销</code></div>
<div class="line number5 index4 alt2"><code class="csharp plain">3.不能用沙盒测试帐号来登录appstore官网或去其它已上线平台去支付详见图4.21</code></div>
<div class="line number6 index5 alt1"><code class="csharp plain">4.运行下面代码的demo,传入你创建的产品id(就是在app iTunes Connect -&gt;我的app -&gt;功能 -&gt;app内购买项目添加的商品),点击充值跳转开始购买详见图4.22</code></div>
<div class="line number7 index6 alt2"><code class="csharp plain">5.再次购买时需要输入测试沙盒账号密码(在用户和职能-&gt;沙箱技术测试员创建的测试账号)详见图4.23</code></div>
<div class="line number8 index7 alt1"><code class="csharp plain">6.购买成功反馈详见图4.24</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>  4.21 图</p>
<p><img src="https://images2015.cnblogs.com/blog/809476/201705/809476-20170525162055263-1387132505.png"></p>
<p>  4.22 图</p>
<p><img src="https://images2015.cnblogs.com/blog/809476/201705/809476-20170525162330013-1989111639.png"></p>
<p>  4.23 图</p>
<p><img src="https://images2015.cnblogs.com/blog/809476/201705/809476-20170525162415935-454479292.png"></p>
<p>  4.24 图</p>
<p> </p>
<p>5.代码及业务逻辑</p>
<p>&nbsp;  业务逻辑</p>
<ol>
<li>获取内购列表(从App内读取或从自己服务器读取)</li>
<li>App Store请求可用的内购列表</li>
<li>向用户展示内购列表</li>
<li>用户选择了内购列表,再发个购买请求,收到购买完成的回调(购买完成后会把钱打给申请内购的银行卡内)</li>
<li>购买流程结束后, 向服务器发起验证凭证以及支付结果的请求</li>
<li>自己的服务器将支付结果信息返回给前端并发放虚拟产品</li>
<li>
<p>服务端的工作比较简单,分4步:</p>
<ol>
<li>接收ios端发过来的购买凭证。</li>
<li>判断凭证是否已经存在或验证过,然后存储该凭证。</li>
<li>将该凭证发送到苹果的服务器验证,并将验证结果返回给客户端。</li>
<li>如果需要,修改用户相应的会员权限。</li>
</ol>
<p>考虑到网络异常情况,服务器的验证应该是一个可恢复的队列,如果网络失败了,应该进行重试。</p>
<p>简单来说就是将该购买凭证用Base64编码,然后POST给苹果的验证服务器,苹果将验证结果以JSON形式返回。</p>
</li>
</ol>
<p><img src="https://images2015.cnblogs.com/blog/809476/201705/809476-20170522114951913-1800620521.png"></p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_391051" class="syntaxhighlightercsharp">
<table style="margin-left: 30px" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
<div class="line number33 index32 alt2">33</div>
<div class="line number34 index33 alt1">34</div>
<div class="line number35 index34 alt2">35</div>
<div class="line number36 index35 alt1">36</div>
<div class="line number37 index36 alt2">37</div>
<div class="line number38 index37 alt1">38</div>
<div class="line number39 index38 alt2">39</div>
<div class="line number40 index39 alt1">40</div>
<div class="line number41 index40 alt2">41</div>
<div class="line number42 index41 alt1">42</div>
<div class="line number43 index42 alt2">43</div>
<div class="line number44 index43 alt1">44</div>
<div class="line number45 index44 alt2">45</div>
<div class="line number46 index45 alt1">46</div>
<div class="line number47 index46 alt2">47</div>
<div class="line number48 index47 alt1">48</div>
<div class="line number49 index48 alt2">49</div>
<div class="line number50 index49 alt1">50</div>
<div class="line number51 index50 alt2">51</div>
<div class="line number52 index51 alt1">52</div>
<div class="line number53 index52 alt2">53</div>
<div class="line number54 index53 alt1">54</div>
<div class="line number55 index54 alt2">55</div>
<div class="line number56 index55 alt1">56</div>
<div class="line number57 index56 alt2">57</div>
<div class="line number58 index57 alt1">58</div>
<div class="line number59 index58 alt2">59</div>
<div class="line number60 index59 alt1">60</div>
<div class="line number61 index60 alt2">61</div>
<div class="line number62 index61 alt1">62</div>
<div class="line number63 index62 alt2">63</div>
<div class="line number64 index63 alt1">64</div>
<div class="line number65 index64 alt2">65</div>
<div class="line number66 index65 alt1">66</div>
<div class="line number67 index66 alt2">67</div>
<div class="line number68 index67 alt1">68</div>
<div class="line number69 index68 alt2">69</div>
<div class="line number70 index69 alt1">70</div>
<div class="line number71 index70 alt2">71</div>
<div class="line number72 index71 alt1">72</div>
<div class="line number73 index72 alt2">73</div>
<div class="line number74 index73 alt1">74</div>
<div class="line number75 index74 alt2">75</div>
<div class="line number76 index75 alt1">76</div>
<div class="line number77 index76 alt2">77</div>
<div class="line number78 index77 alt1">78</div>
<div class="line number79 index78 alt2">79</div>
<div class="line number80 index79 alt1">80</div>
<div class="line number81 index80 alt2">81</div>
<div class="line number82 index81 alt1">82</div>
<div class="line number83 index82 alt2">83</div>
<div class="line number84 index83 alt1">84</div>
<div class="line number85 index84 alt2">85</div>
<div class="line number86 index85 alt1">86</div>
<div class="line number87 index86 alt2">87</div>
<div class="line number88 index87 alt1">88</div>
<div class="line number89 index88 alt2">89</div>
<div class="line number90 index89 alt1">90</div>
<div class="line number91 index90 alt2">91</div>
<div class="line number92 index91 alt1">92</div>
<div class="line number93 index92 alt2">93</div>
<div class="line number94 index93 alt1">94</div>
<div class="line number95 index94 alt2">95</div>
<div class="line number96 index95 alt1">96</div>
<div class="line number97 index96 alt2">97</div>
<div class="line number98 index97 alt1">98</div>
<div class="line number99 index98 alt2">99</div>
<div class="line number100 index99 alt1">100</div>
<div class="line number101 index100 alt2">101</div>
<div class="line number102 index101 alt1">102</div>
<div class="line number103 index102 alt2">103</div>
<div class="line number104 index103 alt1">104</div>
<div class="line number105 index104 alt2">105</div>
<div class="line number106 index105 alt1">106</div>
<div class="line number107 index106 alt2">107</div>
<div class="line number108 index107 alt1">108</div>
<div class="line number109 index108 alt2">109</div>
<div class="line number110 index109 alt1">110</div>
<div class="line number111 index110 alt2">111</div>
<div class="line number112 index111 alt1">112</div>
<div class="line number113 index112 alt2">113</div>
<div class="line number114 index113 alt1">114</div>
<div class="line number115 index114 alt2">115</div>
<div class="line number116 index115 alt1">116</div>
<div class="line number117 index116 alt2">117</div>
<div class="line number118 index117 alt1">118</div>
<div class="line number119 index118 alt2">119</div>
<div class="line number120 index119 alt1">120</div>
<div class="line number121 index120 alt2">121</div>
<div class="line number122 index121 alt1">122</div>
<div class="line number123 index122 alt2">123</div>
<div class="line number124 index123 alt1">124</div>
<div class="line number125 index124 alt2">125</div>
<div class="line number126 index125 alt1">126</div>
<div class="line number127 index126 alt2">127</div>
<div class="line number128 index127 alt1">128</div>
<div class="line number129 index128 alt2">129</div>
<div class="line number130 index129 alt1">130</div>
<div class="line number131 index130 alt2">131</div>
<div class="line number132 index131 alt1">132</div>
<div class="line number133 index132 alt2">133</div>
<div class="line number134 index133 alt1">134</div>
<div class="line number135 index134 alt2">135</div>
<div class="line number136 index135 alt1">136</div>
<div class="line number137 index136 alt2">137</div>
<div class="line number138 index137 alt1">138</div>
<div class="line number139 index138 alt2">139</div>
<div class="line number140 index139 alt1">140</div>
<div class="line number141 index140 alt2">141</div>
<div class="line number142 index141 alt1">142</div>
<div class="line number143 index142 alt2">143</div>
<div class="line number144 index143 alt1">144</div>
<div class="line number145 index144 alt2">145</div>
<div class="line number146 index145 alt1">146</div>
<div class="line number147 index146 alt2">147</div>
<div class="line number148 index147 alt1">148</div>
<div class="line number149 index148 alt2">149</div>
<div class="line number150 index149 alt1">150</div>
<div class="line number151 index150 alt2">151</div>
<div class="line number152 index151 alt1">152</div>
<div class="line number153 index152 alt2">153</div>
<div class="line number154 index153 alt1">154</div>
<div class="line number155 index154 alt2">155</div>
<div class="line number156 index155 alt1">156</div>
<div class="line number157 index156 alt2">157</div>
<div class="line number158 index157 alt1">158</div>
<div class="line number159 index158 alt2">159</div>
<div class="line number160 index159 alt1">160</div>
<div class="line number161 index160 alt2">161</div>
<div class="line number162 index161 alt1">162</div>
<div class="line number163 index162 alt2">163</div>
<div class="line number164 index163 alt1">164</div>
<div class="line number165 index164 alt2">165</div>
<div class="line number166 index165 alt1">166</div>
<div class="line number167 index166 alt2">167</div>
<div class="line number168 index167 alt1">168</div>
<div class="line number169 index168 alt2">169</div>
<div class="line number170 index169 alt1">170</div>
<div class="line number171 index170 alt2">171</div>
<div class="line number172 index171 alt1">172</div>
<div class="line number173 index172 alt2">173</div>
<div class="line number174 index173 alt1">174</div>
<div class="line number175 index174 alt2">175</div>
<div class="line number176 index175 alt1">176</div>
<div class="line number177 index176 alt2">177</div>
<div class="line number178 index177 alt1">178</div>
<div class="line number179 index178 alt2">179</div>
<div class="line number180 index179 alt1">180</div>
<div class="line number181 index180 alt2">181</div>
<div class="line number182 index181 alt1">182</div>
<div class="line number183 index182 alt2">183</div>
<div class="line number184 index183 alt1">184</div>
<div class="line number185 index184 alt2">185</div>
<div class="line number186 index185 alt1">186</div>
<div class="line number187 index186 alt2">187</div>
<div class="line number188 index187 alt1">188</div>
<div class="line number189 index188 alt2">189</div>
<div class="line number190 index189 alt1">190</div>
<div class="line number191 index190 alt2">191</div>
<div class="line number192 index191 alt1">192</div>
<div class="line number193 index192 alt2">193</div>
<div class="line number194 index193 alt1">194</div>
<div class="line number195 index194 alt2">195</div>
<div class="line number196 index195 alt1">196</div>
<div class="line number197 index196 alt2">197</div>
<div class="line number198 index197 alt1">198</div>
<div class="line number199 index198 alt2">199</div>
<div class="line number200 index199 alt1">200</div>
<div class="line number201 index200 alt2">201</div>
<div class="line number202 index201 alt1">202</div>
<div class="line number203 index202 alt2">203</div>
<div class="line number204 index203 alt1">204</div>
<div class="line number205 index204 alt2">205</div>
<div class="line number206 index205 alt1">206</div>
<div class="line number207 index206 alt2">207</div>
<div class="line number208 index207 alt1">208</div>
<div class="line number209 index208 alt2">209</div>
<div class="line number210 index209 alt1">210</div>
<div class="line number211 index210 alt2">211</div>
<div class="line number212 index211 alt1">212</div>
<div class="line number213 index212 alt2">213</div>
<div class="line number214 index213 alt1">214</div>
<div class="line number215 index214 alt2">215</div>
<div class="line number216 index215 alt1">216</div>
<div class="line number217 index216 alt2">217</div>
<div class="line number218 index217 alt1">218</div>
<div class="line number219 index218 alt2">219</div>
<div class="line number220 index219 alt1">220</div>
<div class="line number221 index220 alt2">221</div>
<div class="line number222 index221 alt1">222</div>
<div class="line number223 index222 alt2">223</div>
<div class="line number224 index223 alt1">224</div>
<div class="line number225 index224 alt2">225</div>
<div class="line number226 index225 alt1">226</div>
<div class="line number227 index226 alt2">227</div>
<div class="line number228 index227 alt1">228</div>
<div class="line number229 index228 alt2">229</div>
<div class="line number230 index229 alt1">230</div>
<div class="line number231 index230 alt2">231</div>
<div class="line number232 index231 alt1">232</div>
<div class="line number233 index232 alt2">233</div>
<div class="line number234 index233 alt1">234</div>
<div class="line number235 index234 alt2">235</div>
<div class="line number236 index235 alt1">236</div>
<div class="line number237 index236 alt2">237</div>
<div class="line number238 index237 alt1">238</div>
<div class="line number239 index238 alt2">239</div>
<div class="line number240 index239 alt1">240</div>
<div class="line number241 index240 alt2">241</div>
<div class="line number242 index241 alt1">242</div>
<div class="line number243 index242 alt2">243</div>
<div class="line number244 index243 alt1">244</div>
<div class="line number245 index244 alt2">245</div>
<div class="line number246 index245 alt1">246</div>
<div class="line number247 index246 alt2">247</div>
<div class="line number248 index247 alt1">248</div>
<div class="line number249 index248 alt2">249</div>
<div class="line number250 index249 alt1">250</div>
<div class="line number251 index250 alt2">251</div>
<div class="line number252 index251 alt1">252</div>
<div class="line number253 index252 alt2">253</div>
<div class="line number254 index253 alt1">254</div>
<div class="line number255 index254 alt2">255</div>
<div class="line number256 index255 alt1">256</div>
<div class="line number257 index256 alt2">257</div>
<div class="line number258 index257 alt1">258</div>
<div class="line number259 index258 alt2">259</div>
<div class="line number260 index259 alt1">260</div>
<div class="line number261 index260 alt2">261</div>
<div class="line number262 index261 alt1">262</div>
<div class="line number263 index262 alt2">263</div>
<div class="line number264 index263 alt1">264</div>
<div class="line number265 index264 alt2">265</div>
<div class="line number266 index265 alt1">266</div>
<div class="line number267 index266 alt2">267</div>
<div class="line number268 index267 alt1">268</div>
<div class="line number269 index268 alt2">269</div>
<div class="line number270 index269 alt1">270</div>
<div class="line number271 index270 alt2">271</div>
<div class="line number272 index271 alt1">272</div>
<div class="line number273 index272 alt2">273</div>
<div class="line number274 index273 alt1">274</div>
<div class="line number275 index274 alt2">275</div>
<div class="line number276 index275 alt1">276</div>
<div class="line number277 index276 alt2">277</div>
<div class="line number278 index277 alt1">278</div>
<div class="line number279 index278 alt2">279</div>
<div class="line number280 index279 alt1">280</div>
<div class="line number281 index280 alt2">281</div>
<div class="line number282 index281 alt1">282</div>
<div class="line number283 index282 alt2">283</div>
<div class="line number284 index283 alt1">284</div>
<div class="line number285 index284 alt2">285</div>
<div class="line number286 index285 alt1">286</div>
<div class="line number287 index286 alt2">287</div>
<div class="line number288 index287 alt1">288</div>
<div class="line number289 index288 alt2">289</div>
<div class="line number290 index289 alt1">290</div>
<div class="line number291 index290 alt2">291</div>
<div class="line number292 index291 alt1">292</div>
<div class="line number293 index292 alt2">293</div>
<div class="line number294 index293 alt1">294</div>
<div class="line number295 index294 alt2">295</div>
<div class="line number296 index295 alt1">296</div>
<div class="line number297 index296 alt2">297</div>
<div class="line number298 index297 alt1">298</div>
<div class="line number299 index298 alt2">299</div>
<div class="line number300 index299 alt1">300</div>
<div class="line number301 index300 alt2">301</div>
<div class="line number302 index301 alt1">302</div>
<div class="line number303 index302 alt2">303</div>
<div class="line number304 index303 alt1">304</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="csharp plain"> 代码如下 :</code></div>
<div class="line number2 index1 alt1"><code class="csharp comments">/*注意事项:</code></div>
<div class="line number3 index2 alt2"><code class="csharp comments">1.沙盒环境测试appStore内购流程的时候,请使用没越狱的设备。</code></div>
<div class="line number4 index3 alt1"><code class="csharp comments">2.请务必使用真机来测试,一切以真机为准。</code></div>
<div class="line number5 index4 alt2"><code class="csharp comments">3.项目的Bundle identifier需要与您申请AppID时填写的bundleID一致,不然会无法请求到商品信息。</code></div>
<div class="line number6 index5 alt1"><code class="csharp comments">4.如果是你自己的设备上已经绑定了自己的AppleID账号请先注销掉,否则你哭爹喊娘都不知道是怎么回事。</code></div>
<div class="line number7 index6 alt2"><code class="csharp comments">5.订单校验 苹果审核app时,仍然在沙盒环境下测试,所以需要先进行正式环境验证,如果发现是沙盒环境则转到沙盒验证。</code></div>
<div class="line number8 index7 alt1"><code class="csharp comments">识别沙盒环境订单方法:</code></div>
<div class="line number9 index8 alt2"><code class="csharp spaces">&nbsp;</code><code class="csharp comments">1.根据字段 environment = sandbox。</code></div>
<div class="line number10 index9 alt1"><code class="csharp spaces">&nbsp;</code><code class="csharp comments">2.根据验证接口返回的状态码,如果status=21007,则表示当前为沙盒环境。</code></div>
<div class="line number11 index10 alt2"><code class="csharp spaces">&nbsp;</code><code class="csharp comments">苹果反馈的状态码:</code></div>
<div class="line number12 index11 alt1"><code class="csharp spaces">&nbsp;</code><code class="csharp comments">21000App Store无法读取你提供的JSON数据</code></div>
<div class="line number13 index12 alt2"><code class="csharp spaces">&nbsp;</code><code class="csharp comments">21002 订单数据不符合格式</code></div>
<div class="line number14 index13 alt1"><code class="csharp spaces">&nbsp;</code><code class="csharp comments">21003 订单无法被验证</code></div>
<div class="line number15 index14 alt2"><code class="csharp spaces">&nbsp;</code><code class="csharp comments">21004 你提供的共享密钥和账户的共享密钥不一致</code></div>
<div class="line number16 index15 alt1"><code class="csharp spaces">&nbsp;</code><code class="csharp comments">21005 订单服务器当前不可用</code></div>
<div class="line number17 index16 alt2"><code class="csharp spaces">&nbsp;</code><code class="csharp comments">21006 订单是有效的,但订阅服务已经过期。当收到这个信息时,解码后的收据信息也包含在返回内容中</code></div>
<div class="line number18 index17 alt1"><code class="csharp spaces">&nbsp;</code><code class="csharp comments">21007 订单信息是测试用(sandbox),但却被发送到产品环境中验证</code></div>
<div class="line number19 index18 alt2"><code class="csharp spaces">&nbsp;</code><code class="csharp comments">21008 订单信息是产品环境中使用,但却被发送到测试环境中验证</code></div>
<div class="line number20 index19 alt1"><code class="csharp spaces">&nbsp;</code><code class="csharp comments">*/</code></div>
<div class="line number21 index20 alt2">&nbsp;</div>
<div class="line number22 index21 alt1"><code class="csharp preprocessor">#import &lt;Foundation/Foundation.h&gt;</code></div>
<div class="line number23 index22 alt2">&nbsp;</div>
<div class="line number24 index23 alt1"><code class="csharp plain">typedef&nbsp;</code><code class="csharp keyword">enum</code>&nbsp;<code class="csharp plain">{</code></div>
<div class="line number25 index24 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">SIAPPurchSuccess = 0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp comments">// 购买成功</code></div>
<div class="line number26 index25 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">SIAPPurchFailed = 1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp comments">// 购买失败</code></div>
<div class="line number27 index26 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">SIAPPurchCancle = 2,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp comments">// 取消购买</code></div>
<div class="line number28 index27 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">SIAPPurchVerFailed = 3,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp comments">// 订单校验失败</code></div>
<div class="line number29 index28 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">SIAPPurchVerSuccess = 4,&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp comments">// 订单校验成功</code></div>
<div class="line number30 index29 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">SIAPPurchNotArrow = 5,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp comments">// 不允许内购</code></div>
<div class="line number31 index30 alt2"><code class="csharp plain">}SIAPPurchType;</code></div>
<div class="line number32 index31 alt1">&nbsp;</div>
<div class="line number33 index32 alt2"><code class="csharp plain">typedef&nbsp;</code><code class="csharp keyword">void</code>&nbsp;<code class="csharp plain">(^IAPCompletionHandle)(SIAPPurchType type,NSData *data);</code></div>
<div class="line number34 index33 alt1">&nbsp;</div>
<div class="line number35 index34 alt2">&nbsp;</div>
<div class="line number36 index35 alt1"><code class="csharp plain">@</code><code class="csharp keyword">interface</code>&nbsp;<code class="csharp plain">STRIAPManager : NSObject</code></div>
<div class="line number37 index36 alt2"><code class="csharp plain">+ (instancetype)shareSIAPManager;</code></div>
<div class="line number38 index37 alt1"><code class="csharp comments">//开始内购</code></div>
<div class="line number39 index38 alt2"><code class="csharp plain">- (</code><code class="csharp keyword">void</code><code class="csharp plain">)startPurchWithID:(NSString *)purchID completeHandle:(IAPCompletionHandle)handle;</code></div>
<div class="line number40 index39 alt1"><code class="csharp plain">@end</code></div>
<div class="line number41 index40 alt2"><code class="csharp plain">.m</code></div>
<div class="line number42 index41 alt1"><code class="csharp preprocessor">#import "STRIAPManager.h"</code></div>
<div class="line number43 index42 alt2"><code class="csharp preprocessor">#import &lt;StoreKit/StoreKit.h&gt;</code></div>
<div class="line number44 index43 alt1"><code class="csharp plain">@</code><code class="csharp keyword">interface</code>&nbsp;<code class="csharp plain">STRIAPManager()&lt;SKPaymentTransactionObserver,SKProductsRequestDelegate&gt;{</code></div>
<div class="line number45 index44 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSString&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *_purchID;</code></div>
<div class="line number46 index45 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">IAPCompletionHandle _handle;</code></div>
<div class="line number47 index46 alt2"><code class="csharp plain">}</code></div>
<div class="line number48 index47 alt1"><code class="csharp plain">@end</code></div>
<div class="line number49 index48 alt2"><code class="csharp plain">@implementation STRIAPManager</code></div>
<div class="line number50 index49 alt1">&nbsp;</div>
<div class="line number51 index50 alt2"><code class="csharp preprocessor">#pragma mark - ♻️life cycle</code></div>
<div class="line number52 index51 alt1"><code class="csharp plain">+ (instancetype)shareSIAPManager{</code></div>
<div class="line number53 index52 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code>&nbsp;</div>
<div class="line number54 index53 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">static</code>&nbsp;<code class="csharp plain">STRIAPManager *IAPManager = nil;</code></div>
<div class="line number55 index54 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">static</code>&nbsp;<code class="csharp plain">dispatch_once_t onceToken;</code></div>
<div class="line number56 index55 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">dispatch_once(&amp;onceToken,^{</code></div>
<div class="line number57 index56 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">IAPManager = [ init];</code></div>
<div class="line number58 index57 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">});</code></div>
<div class="line number59 index58 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">return</code>&nbsp;<code class="csharp plain">IAPManager;</code></div>
<div class="line number60 index59 alt1"><code class="csharp plain">}</code></div>
<div class="line number61 index60 alt2"><code class="csharp plain">- (instancetype)init{</code></div>
<div class="line number62 index61 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">self = ;</code></div>
<div class="line number63 index62 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">if</code>&nbsp;<code class="csharp plain">(self) {</code></div>
<div class="line number64 index63 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp comments">// 购买监听写在程序入口,程序挂起时移除监听,这样如果有未完成的订单将会自动执行并回调 paymentQueue:updatedTransactions:方法</code></div>
<div class="line number65 index64 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">[ addTransactionObserver:self];</code></div>
<div class="line number66 index65 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">}</code></div>
<div class="line number67 index66 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">return</code>&nbsp;<code class="csharp plain">self;</code></div>
<div class="line number68 index67 alt1"><code class="csharp plain">}</code></div>
<div class="line number69 index68 alt2">&nbsp;</div>
<div class="line number70 index69 alt1"><code class="csharp plain">- (</code><code class="csharp keyword">void</code><code class="csharp plain">)dealloc{</code></div>
<div class="line number71 index70 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">[ removeTransactionObserver:self];</code></div>
<div class="line number72 index71 alt1"><code class="csharp plain">}</code></div>
<div class="line number73 index72 alt2">&nbsp;</div>
<div class="line number74 index73 alt1">&nbsp;</div>
<div class="line number75 index74 alt2"><code class="csharp preprocessor">#pragma mark - 🚪public</code></div>
<div class="line number76 index75 alt1"><code class="csharp plain">- (</code><code class="csharp keyword">void</code><code class="csharp plain">)startPurchWithID:(NSString *)purchID completeHandle:(IAPCompletionHandle)handle{</code></div>
<div class="line number77 index76 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">if</code>&nbsp;<code class="csharp plain">(purchID) {</code></div>
<div class="line number78 index77 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">if</code>&nbsp;<code class="csharp plain">() {</code></div>
<div class="line number79 index78 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp comments">// 开始购买服务</code></div>
<div class="line number80 index79 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">_purchID = purchID;</code></div>
<div class="line number81 index80 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">_handle = handle;</code></div>
<div class="line number82 index81 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSSet *nsset = ];</code></div>
<div class="line number83 index82 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">SKProductsRequest *request = [ initWithProductIdentifiers:nsset];</code></div>
<div class="line number84 index83 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">request.</code><code class="csharp keyword">delegate</code>&nbsp;<code class="csharp plain">= self;</code></div>
<div class="line number85 index84 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">;</code></div>
<div class="line number86 index85 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">}</code><code class="csharp keyword">else</code><code class="csharp plain">{</code></div>
<div class="line number87 index86 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">;</code></div>
<div class="line number88 index87 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">}</code></div>
<div class="line number89 index88 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">}</code></div>
<div class="line number90 index89 alt1"><code class="csharp plain">}</code></div>
<div class="line number91 index90 alt2"><code class="csharp preprocessor">#pragma mark - 🔒private</code></div>
<div class="line number92 index91 alt1"><code class="csharp plain">- (</code><code class="csharp keyword">void</code><code class="csharp plain">)handleActionWithType:(SIAPPurchType)type data:(NSData *)data{</code></div>
<div class="line number93 index92 alt2"><code class="csharp preprocessor">#if DEBUG</code></div>
<div class="line number94 index93 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">switch</code>&nbsp;<code class="csharp plain">(type) {</code></div>
<div class="line number95 index94 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">case</code>&nbsp;<code class="csharp plain">SIAPPurchSuccess:</code></div>
<div class="line number96 index95 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSLog(</code><code class="csharp string">@"购买成功"</code><code class="csharp plain">);</code></div>
<div class="line number97 index96 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">break</code><code class="csharp plain">;</code></div>
<div class="line number98 index97 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">case</code>&nbsp;<code class="csharp plain">SIAPPurchFailed:</code></div>
<div class="line number99 index98 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSLog(</code><code class="csharp string">@"购买失败"</code><code class="csharp plain">);</code></div>
<div class="line number100 index99 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">break</code><code class="csharp plain">;</code></div>
<div class="line number101 index100 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">case</code>&nbsp;<code class="csharp plain">SIAPPurchCancle:</code></div>
<div class="line number102 index101 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSLog(</code><code class="csharp string">@"用户取消购买"</code><code class="csharp plain">);</code></div>
<div class="line number103 index102 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">break</code><code class="csharp plain">;</code></div>
<div class="line number104 index103 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">case</code>&nbsp;<code class="csharp plain">SIAPPurchVerFailed:</code></div>
<div class="line number105 index104 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSLog(</code><code class="csharp string">@"订单校验失败"</code><code class="csharp plain">);</code></div>
<div class="line number106 index105 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">break</code><code class="csharp plain">;</code></div>
<div class="line number107 index106 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">case</code>&nbsp;<code class="csharp plain">SIAPPurchVerSuccess:</code></div>
<div class="line number108 index107 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSLog(</code><code class="csharp string">@"订单校验成功"</code><code class="csharp plain">);</code></div>
<div class="line number109 index108 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">break</code><code class="csharp plain">;</code></div>
<div class="line number110 index109 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">case</code>&nbsp;<code class="csharp plain">SIAPPurchNotArrow:</code></div>
<div class="line number111 index110 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSLog(</code><code class="csharp string">@"不允许程序内付费"</code><code class="csharp plain">);</code></div>
<div class="line number112 index111 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">break</code><code class="csharp plain">;</code></div>
<div class="line number113 index112 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">default</code><code class="csharp plain">:</code></div>
<div class="line number114 index113 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">break</code><code class="csharp plain">;</code></div>
<div class="line number115 index114 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">}</code></div>
<div class="line number116 index115 alt1"><code class="csharp preprocessor">#endif</code></div>
<div class="line number117 index116 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">if</code><code class="csharp plain">(_handle){</code></div>
<div class="line number118 index117 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">_handle(type,data);</code></div>
<div class="line number119 index118 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">}</code></div>
<div class="line number120 index119 alt1"><code class="csharp plain">}</code></div>
<div class="line number121 index120 alt2"><code class="csharp preprocessor">#pragma mark - 🍐delegate</code></div>
<div class="line number122 index121 alt1"><code class="csharp comments">// 交易结束</code></div>
<div class="line number123 index122 alt2"><code class="csharp plain">- (</code><code class="csharp keyword">void</code><code class="csharp plain">)completeTransaction:(SKPaymentTransaction *)transaction{</code></div>
<div class="line number124 index123 alt1"><code class="csharp spaces">&nbsp;&nbsp;</code><code class="csharp comments">// Your application should implement these two methods.</code></div>
<div class="line number125 index124 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSString * productIdentifier = transaction.payment.productIdentifier;</code></div>
<div class="line number126 index125 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSString * receipt = ;</code></div>
<div class="line number127 index126 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">if</code>&nbsp;<code class="csharp plain">( &gt; 0) {</code></div>
<div class="line number128 index127 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp comments">// 向自己的服务器验证购买凭证</code></div>
<div class="line number129 index128 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">}</code></div>
<div class="line number130 index129 alt1">&nbsp;</div>
<div class="line number131 index130 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">;</code></div>
<div class="line number132 index131 alt1"><code class="csharp plain">}</code></div>
<div class="line number133 index132 alt2">&nbsp;</div>
<div class="line number134 index133 alt1"><code class="csharp comments">// 交易失败</code></div>
<div class="line number135 index134 alt2"><code class="csharp plain">- (</code><code class="csharp keyword">void</code><code class="csharp plain">)failedTransaction:(SKPaymentTransaction *)transaction{</code></div>
<div class="line number136 index135 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">if</code>&nbsp;<code class="csharp plain">(transaction.error.code != SKErrorPaymentCancelled) {</code></div>
<div class="line number137 index136 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">;</code></div>
<div class="line number138 index137 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">}</code><code class="csharp keyword">else</code><code class="csharp plain">{</code></div>
<div class="line number139 index138 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">;</code></div>
<div class="line number140 index139 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">}</code></div>
<div class="line number141 index140 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code>&nbsp;</div>
<div class="line number142 index141 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">[ finishTransaction:transaction];</code></div>
<div class="line number143 index142 alt2"><code class="csharp plain">}</code></div>
<div class="line number144 index143 alt1">&nbsp;</div>
<div class="line number145 index144 alt2"><code class="csharp plain">- (</code><code class="csharp keyword">void</code><code class="csharp plain">)verifyPurchaseWithPaymentTransaction:(SKPaymentTransaction *)transaction isTestServer:(BOOL)flag{</code></div>
<div class="line number146 index145 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp comments">//交易验证</code></div>
<div class="line number147 index146 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSURL *recepitURL = [ appStoreReceiptURL];</code></div>
<div class="line number148 index147 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSData *receipt = ;</code></div>
<div class="line number149 index148 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code>&nbsp;</div>
<div class="line number150 index149 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">if</code><code class="csharp plain">(!receipt){</code></div>
<div class="line number151 index150 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp comments">// 交易凭证为空验证失败</code></div>
<div class="line number152 index151 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">;</code></div>
<div class="line number153 index152 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">return</code><code class="csharp plain">;</code></div>
<div class="line number154 index153 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">}</code></div>
<div class="line number155 index154 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp comments">// 购买成功将交易凭证发送给服务端进行再次校验</code></div>
<div class="line number156 index155 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">;</code></div>
<div class="line number157 index156 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code>&nbsp;</div>
<div class="line number158 index157 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSError *error;</code></div>
<div class="line number159 index158 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSDictionary *requestContents = @{</code></div>
<div class="line number160 index159 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp string">@"receipt-data"</code><code class="csharp plain">: </code></div>
<div class="line number161 index160 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">};</code></div>
<div class="line number162 index161 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestContents</code></div>
<div class="line number163 index162 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">options:0</code></div>
<div class="line number164 index163 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">error:&amp;error];</code></div>
<div class="line number165 index164 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code>&nbsp;</div>
<div class="line number166 index165 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">if</code>&nbsp;<code class="csharp plain">(!requestData) {&nbsp;</code><code class="csharp comments">// 交易凭证为空验证失败</code></div>
<div class="line number167 index166 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">;</code></div>
<div class="line number168 index167 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">return</code><code class="csharp plain">;</code></div>
<div class="line number169 index168 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">}</code></div>
<div class="line number170 index169 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code>&nbsp;</div>
<div class="line number171 index170 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp comments">//In the test environment, use https://sandbox.itunes.apple.com/verifyReceipt</code></div>
<div class="line number172 index171 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp comments">//In the real environment, use https://buy.itunes.apple.com/verifyReceipt</code></div>
<div class="line number173 index172 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code>&nbsp;</div>
<div class="line number174 index173 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSString *serverString =&nbsp;</code><code class="csharp string">@"https://buy.itunes.apple.com/verifyReceipt"</code><code class="csharp plain">;</code></div>
<div class="line number175 index174 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">if</code>&nbsp;<code class="csharp plain">(flag) {</code></div>
<div class="line number176 index175 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">serverString =&nbsp;</code><code class="csharp string">@"https://sandbox.itunes.apple.com/verifyReceipt"</code><code class="csharp plain">;</code></div>
<div class="line number177 index176 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">}</code></div>
<div class="line number178 index177 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSURL *storeURL = ;</code></div>
<div class="line number179 index178 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSMutableURLRequest *storeRequest = ;</code></div>
<div class="line number180 index179 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">;</code></div>
<div class="line number181 index180 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">;</code></div>
<div class="line number182 index181 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code>&nbsp;</div>
<div class="line number183 index182 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSOperationQueue *queue = [ init];</code></div>
<div class="line number184 index183 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">[NSURLConnection sendAsynchronousRequest:storeRequest queue:queue</code></div>
<div class="line number185 index184 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {</code></div>
<div class="line number186 index185 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">if</code>&nbsp;<code class="csharp plain">(connectionError) {</code></div>
<div class="line number187 index186 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp comments">// 无法连接服务器,购买校验失败</code></div>
<div class="line number188 index187 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">;</code></div>
<div class="line number189 index188 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">}&nbsp;</code><code class="csharp keyword">else</code>&nbsp;<code class="csharp plain">{</code></div>
<div class="line number190 index189 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSError *error;</code></div>
<div class="line number191 index190 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSDictionary *jsonResponse = ;</code></div>
<div class="line number192 index191 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">if</code>&nbsp;<code class="csharp plain">(!jsonResponse) {</code></div>
<div class="line number193 index192 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp comments">// 苹果服务器校验数据返回为空校验失败</code></div>
<div class="line number194 index193 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">;</code></div>
<div class="line number195 index194 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">}</code></div>
<div class="line number196 index195 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code>&nbsp;</div>
<div class="line number197 index196 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp comments">// 先验证正式服务器,如果正式服务器返回21007再去苹果测试服务器验证,沙盒测试环境苹果用的是测试服务器</code></div>
<div class="line number198 index197 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSString *status = ];</code></div>
<div class="line number199 index198 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">if</code>&nbsp;<code class="csharp plain">(status &amp;&amp; ) {</code></div>
<div class="line number200 index199 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">;</code></div>
<div class="line number201 index200 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">}</code><code class="csharp keyword">else</code>&nbsp;<code class="csharp keyword">if</code><code class="csharp plain">(status &amp;&amp; ){</code></div>
<div class="line number202 index201 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">;</code></div>
<div class="line number203 index202 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">}</code></div>
<div class="line number204 index203 alt1"><code class="csharp preprocessor">#if DEBUG</code></div>
<div class="line number205 index204 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSLog(</code><code class="csharp string">@"----验证结果 %@"</code><code class="csharp plain">,jsonResponse);</code></div>
<div class="line number206 index205 alt1"><code class="csharp preprocessor">#endif</code></div>
<div class="line number207 index206 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">}</code></div>
<div class="line number208 index207 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">}];</code></div>
<div class="line number209 index208 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code>&nbsp;</div>
<div class="line number210 index209 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code>&nbsp;</div>
<div class="line number211 index210 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp comments">// 验证成功与否都注销交易,否则会出现虚假凭证信息一直验证不通过,每次进程序都得输入苹果账号</code></div>
<div class="line number212 index211 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">[ finishTransaction:transaction];</code></div>
<div class="line number213 index212 alt2"><code class="csharp plain">}</code></div>
<div class="line number214 index213 alt1">&nbsp;</div>
<div class="line number215 index214 alt2"><code class="csharp preprocessor">#pragma mark - SKProductsRequestDelegate</code></div>
<div class="line number216 index215 alt1"><code class="csharp plain">- (</code><code class="csharp keyword">void</code><code class="csharp plain">)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{</code></div>
<div class="line number217 index216 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSArray *product = response.products;</code></div>
<div class="line number218 index217 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">if</code><code class="csharp plain">( &lt;= 0){</code></div>
<div class="line number219 index218 alt2"><code class="csharp preprocessor">#if DEBUG</code></div>
<div class="line number220 index219 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSLog(</code><code class="csharp string">@"--------------没有商品------------------"</code><code class="csharp plain">);</code></div>
<div class="line number221 index220 alt2"><code class="csharp preprocessor">#endif</code></div>
<div class="line number222 index221 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">return</code><code class="csharp plain">;</code></div>
<div class="line number223 index222 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">}</code></div>
<div class="line number224 index223 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code>&nbsp;</div>
<div class="line number225 index224 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">SKProduct *p = nil;</code></div>
<div class="line number226 index225 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">for</code><code class="csharp plain">(SKProduct *pro&nbsp;</code><code class="csharp keyword">in</code>&nbsp;<code class="csharp plain">product){</code></div>
<div class="line number227 index226 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">if</code><code class="csharp plain">(){</code></div>
<div class="line number228 index227 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">p = pro;</code></div>
<div class="line number229 index228 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">break</code><code class="csharp plain">;</code></div>
<div class="line number230 index229 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">}</code></div>
<div class="line number231 index230 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">}</code></div>
<div class="line number232 index231 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code>&nbsp;</div>
<div class="line number233 index232 alt2"><code class="csharp preprocessor">#if DEBUG</code></div>
<div class="line number234 index233 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSLog(</code><code class="csharp string">@"productID:%@"</code><code class="csharp plain">, response.invalidProductIdentifiers);</code></div>
<div class="line number235 index234 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSLog(</code><code class="csharp string">@"产品付费数量:%lu"</code><code class="csharp plain">,(unsigned&nbsp;</code><code class="csharp keyword">long</code><code class="csharp plain">));</code></div>
<div class="line number236 index235 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSLog(</code><code class="csharp string">@"%@"</code><code class="csharp plain">,);</code></div>
<div class="line number237 index236 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSLog(</code><code class="csharp string">@"%@"</code><code class="csharp plain">,);</code></div>
<div class="line number238 index237 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSLog(</code><code class="csharp string">@"%@"</code><code class="csharp plain">,);</code></div>
<div class="line number239 index238 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSLog(</code><code class="csharp string">@"%@"</code><code class="csharp plain">,);</code></div>
<div class="line number240 index239 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSLog(</code><code class="csharp string">@"%@"</code><code class="csharp plain">,);</code></div>
<div class="line number241 index240 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSLog(</code><code class="csharp string">@"发送购买请求"</code><code class="csharp plain">);</code></div>
<div class="line number242 index241 alt1"><code class="csharp preprocessor">#endif</code></div>
<div class="line number243 index242 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code>&nbsp;</div>
<div class="line number244 index243 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">SKPayment *payment = ;</code></div>
<div class="line number245 index244 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">[ addPayment:payment];</code></div>
<div class="line number246 index245 alt1"><code class="csharp plain">}</code></div>
<div class="line number247 index246 alt2">&nbsp;</div>
<div class="line number248 index247 alt1"><code class="csharp comments">//请求失败</code></div>
<div class="line number249 index248 alt2"><code class="csharp plain">- (</code><code class="csharp keyword">void</code><code class="csharp plain">)request:(SKRequest *)request didFailWithError:(NSError *)error{</code></div>
<div class="line number250 index249 alt1"><code class="csharp preprocessor">#if DEBUG</code></div>
<div class="line number251 index250 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSLog(</code><code class="csharp string">@"------------------错误-----------------:%@"</code><code class="csharp plain">, error);</code></div>
<div class="line number252 index251 alt1"><code class="csharp preprocessor">#endif</code></div>
<div class="line number253 index252 alt2"><code class="csharp plain">}</code></div>
<div class="line number254 index253 alt1">&nbsp;</div>
<div class="line number255 index254 alt2"><code class="csharp plain">- (</code><code class="csharp keyword">void</code><code class="csharp plain">)requestDidFinish:(SKRequest *)request{</code></div>
<div class="line number256 index255 alt1"><code class="csharp preprocessor">#if DEBUG</code></div>
<div class="line number257 index256 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSLog(</code><code class="csharp string">@"------------反馈信息结束-----------------"</code><code class="csharp plain">);</code></div>
<div class="line number258 index257 alt1"><code class="csharp preprocessor">#endif</code></div>
<div class="line number259 index258 alt2"><code class="csharp plain">}</code></div>
<div class="line number260 index259 alt1">&nbsp;</div>
<div class="line number261 index260 alt2"><code class="csharp preprocessor">#pragma mark - SKPaymentTransactionObserver</code></div>
<div class="line number262 index261 alt1"><code class="csharp plain">- (</code><code class="csharp keyword">void</code><code class="csharp plain">)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray&lt;SKPaymentTransaction *&gt; *)transactions{</code></div>
<div class="line number263 index262 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">for</code>&nbsp;<code class="csharp plain">(SKPaymentTransaction *tran&nbsp;</code><code class="csharp keyword">in</code>&nbsp;<code class="csharp plain">transactions) {</code></div>
<div class="line number264 index263 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">switch</code>&nbsp;<code class="csharp plain">(tran.transactionState) {</code></div>
<div class="line number265 index264 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">case</code>&nbsp;<code class="csharp plain">SKPaymentTransactionStatePurchased:</code></div>
<div class="line number266 index265 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">;</code></div>
<div class="line number267 index266 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">break</code><code class="csharp plain">;</code></div>
<div class="line number268 index267 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">case</code>&nbsp;<code class="csharp plain">SKPaymentTransactionStatePurchasing:</code></div>
<div class="line number269 index268 alt2"><code class="csharp preprocessor">#if DEBUG</code></div>
<div class="line number270 index269 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSLog(</code><code class="csharp string">@"商品添加进列表"</code><code class="csharp plain">);</code></div>
<div class="line number271 index270 alt2"><code class="csharp preprocessor">#endif</code></div>
<div class="line number272 index271 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">break</code><code class="csharp plain">;</code></div>
<div class="line number273 index272 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">case</code>&nbsp;<code class="csharp plain">SKPaymentTransactionStateRestored:</code></div>
<div class="line number274 index273 alt1"><code class="csharp preprocessor">#if DEBUG</code></div>
<div class="line number275 index274 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">NSLog(</code><code class="csharp string">@"已经购买过商品"</code><code class="csharp plain">);</code></div>
<div class="line number276 index275 alt1"><code class="csharp preprocessor">#endif</code></div>
<div class="line number277 index276 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp comments">// 消耗型不支持恢复购买</code></div>
<div class="line number278 index277 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">[ finishTransaction:tran];</code></div>
<div class="line number279 index278 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">break</code><code class="csharp plain">;</code></div>
<div class="line number280 index279 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">case</code>&nbsp;<code class="csharp plain">SKPaymentTransactionStateFailed:</code></div>
<div class="line number281 index280 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">;</code></div>
<div class="line number282 index281 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">break</code><code class="csharp plain">;</code></div>
<div class="line number283 index282 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">default</code><code class="csharp plain">:</code></div>
<div class="line number284 index283 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">break</code><code class="csharp plain">;</code></div>
<div class="line number285 index284 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">}</code></div>
<div class="line number286 index285 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">}</code></div>
<div class="line number287 index286 alt2"><code class="csharp plain">}</code></div>
<div class="line number288 index287 alt1"><code class="csharp plain">@end</code></div>
<div class="line number289 index288 alt2"><code class="csharp plain">在控制器中调用,导入头文件</code></div>
<div class="line number290 index289 alt1"><code class="csharp plain">调用方法</code></div>
<div class="line number291 index290 alt2"><code class="csharp plain">- (</code><code class="csharp keyword">void</code><code class="csharp plain">)purchaseAction{</code></div>
<div class="line number292 index291 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code>&nbsp;</div>
<div class="line number293 index292 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp keyword">if</code>&nbsp;<code class="csharp plain">(!_IAPManager) {</code></div>
<div class="line number294 index293 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">_IAPManager = ;</code></div>
<div class="line number295 index294 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">}</code></div>
<div class="line number296 index295 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp comments">// iTunesConnect 苹果后台配置的产品ID</code></div>
<div class="line number297 index296 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">[_IAPManager startPurchWithID:</code><code class="csharp string">@"com.bb.helper_advisory"</code>&nbsp;<code class="csharp plain">completeHandle:^(SIAPPurchType type,NSData *data) {</code></div>
<div class="line number298 index297 alt1"><code class="csharp comments">//请求事务回调类型,返回的数据</code></div>
<div class="line number299 index298 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code>&nbsp;</div>
<div class="line number300 index299 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">}];</code></div>
<div class="line number301 index300 alt2"><code class="csharp plain">}</code></div>
<div class="line number302 index301 alt1"><code class="csharp plain">经典文章参考: 1.&nbsp; http:</code><code class="csharp comments">//yimouleng.com/2015/12/17/ios-AppStore/&nbsp; 内购流程</code></div>
<div class="line number303 index302 alt2"><code class="csharp plain">        2.&nbsp;&nbsp; http:</code><code class="csharp comments">//www.jianshu.com/p/b199a4672608&nbsp;&nbsp; 完成交易后和服务器交互</code></div>
<div class="line number304 index303 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">3.&nbsp;&nbsp; http:</code><code class="csharp comments">//www.jianshu.com/p/1ef61a785508 沙盒账号测试</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div id="MySignature">将来的自己,会感谢现在不放弃的自己!</div>
</div><br><br>
来源:https://www.cnblogs.com/shoshana-kong/p/10991586.html
頁: [1]
查看完整版本: iOS开发支付篇——内购(IAP)详解