一点PHP博客分享PHP如何和苹果支付打交道,苹果支付和其他支付略有不同,PHP在其中扮演的角色只是一名检验员。客户端APP通过苹果的SDK调起苹果完成支付以后,会获得苹果返回的一系列参数,与此同时客户端将这些参数传输给PHP后端,PHP获取到这些参数以后使用curl等方式调用苹果接口进行验证是否支付成功。
搞清楚PHP在这次支付过程中扮演的角色以后,在看接下来PHP具体执行的代码过程(类中抽出的代码):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
public function appleNotify(){ //接收来自客户端的参数 $receipt_data = file_get_contents('php://input'); // 验证支付状态 $data = json_decode($receipt_data,true); //进行苹果的验证 $result=self::validate_apple_pay($data['reqdata']['receipt_data']); if($result['status']){ // 验证通过 此处可以是修改数据库订单状态等操作 }else{ // 验证不通过 } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
/** * 验证AppStore内付 * @param string $receipt_data 付款后凭证 * @return array 验证是否成功 */ function validate_apple_pay($receipt_data){ // 验证参数 if (strlen($receipt_data)<20){ $result=array( 'status'=>false, 'message'=>'非法参数' ); return $result; } // 请求验证 $html = self::acurl($receipt_data); $data = json_decode($html,true); // 如果是沙盒数据 则验证沙盒模式 if($data['status']=='21007'){ // 请求验证 $html = self::acurl($receipt_data, 1); $data = json_decode($html,true); $data['sandbox'] = '1'; } if (isset($_GET['debug'])) { exit(json_encode($data)); } // 判断是否购买成功 if(intval($data['status']) === 0){ $result=array( 'status'=>true, 'message'=>'购买成功' ); }else{ $result=array( 'status'=>false, 'message'=>'购买失败 status:'.$data['status'] ); } return $result; } /** * 21000 App Store不能读取你提供的JSON对象 * 21002 receipt-data域的数据有问题 * 21003 receipt无法通过验证 * 21004 提供的shared secret不匹配你账号中的shared secret * 21005 receipt服务器当前不可用 * 21006 receipt合法,但是订阅已过期。服务器接收到这个状态码时,receipt数据仍然会解码并一起发送 * 21007 receipt是Sandbox receipt,但却发送至生产系统的验证服务 * 21008 receipt是生产receipt,但却发送至Sandbox环境的验证服务 */ public function acurl($receipt_data, $sandbox=0){ //小票信息 $POSTFIELDS = array("receipt-data" => $receipt_data); $POSTFIELDS = json_encode($POSTFIELDS); //正式购买地址 沙盒购买地址 $url_buy = "https://buy.itunes.apple.com/verifyReceipt"; $url_sandbox = "https://sandbox.itunes.apple.com/verifyReceipt"; $url = $sandbox ? $url_sandbox : $url_buy; //简单的curl $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $POSTFIELDS); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $result = curl_exec($ch); curl_close($ch); return $result; } |
以上代码博主亲测有效,有任何问题可以留言或者私信博主,如果要复制粘贴使用需要注意修改部分写法,代码是从类中直接抽出需要微改。要是需要接入微信支付,可以移步这篇文章laravel实现微信支付这篇文章有详细介绍关于PHP操作微信支付步骤顺序。
一点PHP,每天一点技术分享。