refundgoogle.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <?php
  2. defined('IN_WEB') or die('Include Error!');
  3. /**
  4. * 安卓退款订单处理
  5. */
  6. class ModelRefundgoogle
  7. {
  8. //响应是一个 JSON 字符串,其中包含已作废购买交易的列表。如果结果数量超过了在 maxResults 请求参数中指定的数量,响应就会包含一个 nextPageToken 值,您可以将该值传递给后续请求来查看更多结果。列表中的第一个结果显示的是最早作废的购买交易。
  9. //参考:https://developers.google.com/android-publisher/voided-purchases?hl=zh-cn
  10. private $_refundApi = 'https://www.googleapis.com/androidpublisher/v3/applications/%s/purchases/voidedpurchases?access_token=%s&type=1';
  11. /**
  12. * 从谷歌支付api获取退款订单列表
  13. * @param int $startTime
  14. * @param int $endTime
  15. */
  16. public function getRefundListFromGoogle($startTime = 0, $endTime = 0, $nextPageToken = '') {
  17. if(IS_DEBUF){
  18. return [];
  19. }
  20. $package = oo::commonOprModel('paymentgoogle')->getPackageName();
  21. $token = !empty($nextPageToken) ? $nextPageToken : oo::commonOprModel('paymentgoogle')->getToken();
  22. $url = sprintf($this->_refundApi, $package, $token);
  23. if(!empty($startTime)){
  24. $url .= "&startTime={$startTime}";
  25. }
  26. if(!empty($endTime)){
  27. $url .= "&endTime={$endTime}";
  28. }
  29. return $this->curlGetHttps($url);
  30. }
  31. /**
  32. * 处理谷歌退款订单
  33. * @param $day 日期
  34. * @return bool
  35. */
  36. public function dealRefundOrders($day = 0, $nextPageToken = '') {
  37. $startTime = $endTime = 0;
  38. if(!empty($day)){
  39. $startTime = strtotime($day) * 1000;
  40. //$endTime = (strtotime($day) + 24 * 3600) * 1000 - 1;
  41. }
  42. $arr = $this->getRefundListFromGoogle($startTime, $endTime, $nextPageToken);
  43. //$file = WWWROOT .'voidedpurchases.txt';
  44. //$tmp = file_get_contents($file);
  45. //if(empty($tmp)){
  46. // oo::logs()->debug3(["err"=>'get refund summarylist error, no data'],'refund_err');
  47. // return false;
  48. //}
  49. //$arr = $tmp ? json_decode($tmp, true) : [];
  50. if(empty($arr['voidedPurchases'])){ //退款订单列表为空
  51. return true;
  52. }
  53. $refundArr = [];
  54. foreach($arr['voidedPurchases'] as $val){
  55. $refundArr[] = $val['orderId'];
  56. if(count($refundArr) > 50){
  57. $ret = $this->upRefundArr($refundArr);
  58. if(!$ret){
  59. oo::logs()->debug3(["err"=>'update refund summarylist error',"param"=>$refundArr],'refund_err');
  60. }
  61. $refundArr = [];
  62. }
  63. }
  64. if(count($refundArr) > 0){
  65. $ret = $this->upRefundArr($refundArr);
  66. }
  67. if(!empty($arr['tokenPagination'])){
  68. return $this->dealRefundOrders($day, $arr['tokenPagination']['nextPageToken']);
  69. }
  70. return $ret;
  71. }
  72. /**
  73. * 更新退款订单
  74. */
  75. private function upRefundArr($arr, $type = 1) {
  76. $tb = otable::summarylist();
  77. $in = implode("','", $arr);
  78. $sql = "UPDATE {$tb} SET sl_status = 3 WHERE sl_platform_serial_num IN('".$in."')";
  79. $res1 = oo::commonOprDb('payment')->query($sql);
  80. $year = date("Y",strtotime('-1 days', time()));
  81. $year =intval($year)<2022?2022:intval($year);
  82. $tb2 = otable::orderNew($year);
  83. $sql2 = "update {$tb2} set status=3 where external_order_id IN('".$in."')";
  84. $res2 = oo::commonOprDb('common')->query($sql2);
  85. oo::logs()->debug3(["nums"=>count($arr),"orderList"=>$arr,"res1"=>$res1,"res2"=>$res2],"refundOrder.log");
  86. return ;
  87. }
  88. /**
  89. * 获取json格式的curl get请求结果
  90. * @param $url
  91. * @return array
  92. */
  93. function curlGetHttps($url){
  94. $curl = curl_init();
  95. curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
  96. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
  97. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
  98. //curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器
  99. curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
  100. curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
  101. curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
  102. curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
  103. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
  104. $tmp = curl_exec($curl); // 执行操作
  105. if (!IS_DEBUF && curl_errno($curl)) {
  106. echo 'Errno'.curl_error($curl);//捕抓异常
  107. }
  108. curl_close($curl); // 关闭CURL会话
  109. return $tmp ? (array)json_decode($tmp, true) : []; // 返回数据,json格式
  110. }
  111. }