- public function iosNotify(Request $request,ResponseFactoryContract $response,NotifyInterface $notify){
- //苹果内购的验证收据
- $receipt_data = $request->input('apple_receipt');
- $pay_sn = $request->input('pay_sn');
- $ios_sandBox = env('IOS_SANDBOX',false);//判断生产环境,开发环境
- if(emptyempty($receipt_data) || !$pay_sn){
- return $response->json(['message'=>'参数不正确'])->setStatusCode(422);
- }
- // 验证ios内购支付状态
- $result=$this->validate_apple_pay($receipt_data,$ios_sandBox);
- if($result['status']){
- // 验证通过 此处可以是修改数据库订单状态等操作
- $recharge = Recharge::where('pay_sn',$pay_sn)->first();
- if(!$recharge){
- return $response->json(['message'=>'订单不存在'])->setStatusCode(422);
- }
- if($recharge['payment_state'] == 1){
- return $response->json(['message'=>'订单已支付了'])->setStatusCode(422);
- }
- return DB::transaction(function () use ($notify,$pay_sn,$response){
- $result = $notify->iosChangeState(3,$pay_sn);
- if($result) {
- return $response->json(['message' => '支付成功'])->setStatusCode(200);
- }else{
- return $response->json(['message' => '支付失败'])->setStatusCode(400);
- }
- });
- }else{
- return $response->json(['message'=>$result['message']])->setStatusCode(422);
- }
- }
- /**
- * 验证AppStore内付
- * @param string $receipt_data 付款后凭证
- * @return array 验证是否成功
- */
- protected function validate_apple_pay($receipt_data,$ios_sandBox){
- /**
- * 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环境的验证服务
- */
- // 验证参数
- if (strlen($receipt_data)<20){
- $result=array(
- 'status'=>false,
- 'message'=>'非法参数'
- );
- return $result;
- }
- if($ios_sandBox){
- // 请求验证
- $html = $this->acurl($receipt_data);
- $data = json_decode($html,true);
- }else{
- // 请求验证
- $html = $this->acurl($receipt_data, 1);
- $data = json_decode($html,true);
- }
- if (!is_array($data) && !isset($data['status'])) {
- $result=array(
- 'status'=>false,
- 'message'=>'获取数据失败'
- );
- return $result;
- }
- // 判断是否购买成功
- if($data['status'] ===0){
- $result=array(
- 'status'=>true,
- 'message'=>'购买成功'
- );
- }else{
- $result=array(
- 'status'=>false,
- 'message'=>'购买失败 status:'.$data['status']
- );
- }
- return $result;
- }
- protected 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_handle=curl_init();
- curl_setopt($curl_handle,CURLOPT_URL, $url);
- curl_setopt($curl_handle, CURLOPT_TIMEOUT, '3');
- curl_setopt($curl_handle,CURLOPT_RETURNTRANSFER, true);
- curl_setopt($curl_handle,CURLOPT_HEADER, 0);
- curl_setopt($curl_handle,CURLOPT_POST, true);
- curl_setopt($curl_handle,CURLOPT_POSTFIELDS, $POSTFIELDS);
- curl_setopt($curl_handle,CURLOPT_SSL_VERIFYHOST, 0);
- curl_setopt($curl_handle,CURLOPT_SSL_VERIFYPEER, 0);
- $result =curl_exec($curl_handle);
- curl_close($curl_handle);
- return $result;
- }