Alipay.php 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. <?php
  2. namespace app\index\controller;
  3. use alipay\Wappay;
  4. use app\index\model\AliPayRecordModel;
  5. use app\index\model\AuthCompanyModel;
  6. use app\index\service\HelperService;
  7. use think\Controller;
  8. use think\Log;
  9. use think\Validate;
  10. /**
  11. * 功能:支付宝手机网站支付接口(alipay.trade.wap.pay)接口调试入口页面
  12. * 版本:2.0
  13. * 修改日期:2016-11-01
  14. * 说明:
  15. * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。请确保项目文件有可写权限,不然打印不了日志。
  16. */
  17. class Alipay extends Controller
  18. {
  19. public function PlatformAlipay(){
  20. $params = $this->request->param();
  21. $rule = [
  22. 'return_url'=>'require',
  23. 'out_trade_no'=>'require',
  24. 'total_amount'=>'require',
  25. 'discountable_amount'=>'require',
  26. 'subject'=>'require',
  27. //'body'=>'require',
  28. //goods_id,goods_name,quantity,price,goods_category,body,show_url
  29. 'goods_detail'=>'isset',
  30. 'store_id'=>'isset',
  31. 'terminal_id'=>'isset',
  32. 'extend_params'=>'isset',
  33. 'company_code'=>'require'
  34. ];
  35. $validate = new Validate($rule);
  36. if(!$validate->check($params)){
  37. HelperService::returnJson(['code'=>400,'msg'=>$validate->getError()]);
  38. }
  39. Log::record($params);
  40. $companyCode = $params['company_code'];
  41. unset($params['company_code']);
  42. if(!file_exists("./$companyCode/alipay/app_private_key.pem")){
  43. $this->error('很抱歉,暂不支持支付宝平台');
  44. }
  45. $body = "";
  46. $goods_detail = isset($params['goods_detail'])?json_decode($params['goods_detail'],true):'';
  47. // if(!empty($goods_detail)){
  48. // $body .= '消费详情:';
  49. // foreach($goods_detail as $key=>$item){
  50. // $list_no = $key+1;
  51. // $body .= " ({$list_no})、{$item['goods_name']}x{$item['quantity']}份 = {$item['price']}元;";
  52. // }
  53. // }
  54. // try {
  55. //$out_trade_no_arr = explode('_',"{$params['out_trade_no']}");
  56. $order_no = @reset(explode('_',"{$params['out_trade_no']}"));
  57. //判断改公司是否存在
  58. $companySmsJson = $this->_companyExist($companyCode);
  59. if ($companySmsJson === false) {
  60. die("<script>window.alert = function(name){var iframe = document.createElement('IFRAME');iframe.style.display='none';iframe.setAttribute('src', 'data:text/plain,');document.documentElement.appendChild(iframe);window.frames[0].window.alert(name);iframe.parentNode.removeChild(iframe);};alert('公司不存在!');window.history.go(-1);</script>");
  61. }
  62. //判断订单号是否已经支付过
  63. $AliPayRecordModel = new AliPayRecordModel();
  64. $AliPayRecord = $AliPayRecordModel->where(['order_no' => "{$order_no}", 'company_code' => "{$companyCode}"])->find();
  65. if (!empty($AliPayRecord)) {
  66. die("<script>window.alert = function(name){var iframe = document.createElement('IFRAME');iframe.style.display='none';iframe.setAttribute('src', 'data:text/plain,');document.documentElement.appendChild(iframe);window.frames[0].window.alert(name);iframe.parentNode.removeChild(iframe);};alert('该订单已经支付');window.history.go(-1);</script>");
  67. }
  68. Log::record('ALIPAY-SQL'.$AliPayRecordModel->getLastSql());
  69. $submitForm = Wappay::pay(array_filter([
  70. 'out_trade_no' => $params['out_trade_no'],
  71. 'subject' => "{$params['subject']}",//售卖项目(Iphone6 16G)
  72. 'total_amount' => $params['total_amount'],
  73. 'discountable_amount' => $params['discountable_amount'],
  74. 'body' => $body,
  75. //'goods_detail'=>$goods_detail,
  76. 'auth_token' => isset($companySmsJson['app_auth_token'])?$companySmsJson['app_auth_token']:"",
  77. 'extend_params'=>isset($companySmsJson['sys_service_provider_id'])?['sys_service_provider_id'=>$companySmsJson['sys_service_provider_id']]:[],
  78. 'seller_id' => isset($companySmsJson['ali_seller_id'])?$companySmsJson['ali_seller_id']:"",
  79. 'operator_id' => isset($params['operator_id']) ? $params['operator_id'] : 'ky_vapi',
  80. 'terminal_id' => $params['terminal_id'],
  81. 'timeout_express' => '1m'
  82. ]), [
  83. 'gatewayUrl' => 'https://openapi.alipay.com/gateway.do',
  84. //'app_id' => $params['app_id'],
  85. 'app_id' => $companySmsJson['app_id'],
  86. 'merchant_private_key' => file_get_contents("./$companyCode/alipay/app_private_key.pem"),
  87. 'alipay_public_key' => file_get_contents("./$companyCode/alipay/app_public_key.pem"),
  88. 'sign_type' => isset($companySmsJson['sign_type'])?$companySmsJson['sign_type']:'RSA2',
  89. 'format' => 'JSON',
  90. 'return_url' => $params['return_url'],
  91. 'notify_url' => 'http://' . $_SERVER['SERVER_NAME'] . '/index/Alipay/notifyPlatformAlipay',
  92. ]);
  93. Log::record("$submitForm");
  94. $this->assign('submitForm', $submitForm);
  95. // }catch (\Exception $ex){
  96. // die("<script>window.alert = function(name){var iframe = document.createElement('IFRAME');iframe.style.display='none';iframe.setAttribute('src', 'data:text/plain,');document.documentElement.appendChild(iframe);window.frames[0].window.alert(name);iframe.parentNode.removeChild(iframe);};alert('".$ex->getMessage()."');window.history.go(-1);</script>");
  97. // }
  98. return $this->fetch('alipay/pay');
  99. }
  100. private function _companyExist($companyCode){
  101. $AuthCompanyModel = new AuthCompanyModel();
  102. $companyInfo = $AuthCompanyModel->getInfo(['company_code'=>$companyCode]);
  103. if(empty($companyInfo) || empty($companyInfo['sms_json'])){
  104. return false;
  105. }
  106. return json_decode($companyInfo['sms_json'],true);
  107. }
  108. public function notifyPlatformAlipay(){
  109. $params = $this->request->param();
  110. try {
  111. $AliPayRecordModel = new AliPayRecordModel();
  112. $res = $AliPayRecordModel->where(['out_trade_no'=>"{$params['out_trade_no']}"])->find();
  113. if(!empty($res)){
  114. die('success');
  115. }
  116. $out_trade_no_arr = explode('_', "{$params['out_trade_no']}");
  117. $order_no = current($out_trade_no_arr);
  118. $companyCode = end($out_trade_no_arr);
  119. $data = [
  120. 'order_no' => "{$order_no}",
  121. 'total_fee' => "{$params['total_amount']}",
  122. 'out_trade_no' => "{$params['out_trade_no']}",
  123. 'add_ts' => time(),
  124. 'alipay_msg' => json_encode($params),
  125. 'trade_no' => "{$params['trade_no']}",
  126. 'company_code' => $companyCode,
  127. ];
  128. try{
  129. $AliPayRecordModel->save($data);
  130. } catch (\Exception $ex){
  131. Log::record('重复插入记录'.$ex->getMessage());
  132. die('success');
  133. }
  134. $companyInfo = $this->_validCompanyCode($companyCode);
  135. if ($companyInfo === false) {
  136. Log::record('notifyPlatformAlipay:公司信息不存在');
  137. die('fail(company dont have)');
  138. }
  139. $smsJson = json_decode($companyInfo['sms_json'], true);
  140. if (isset($smsJson['alipay_url'])) {
  141. $url = $smsJson['alipay_url'];
  142. $url = strpos($url,'?')>0?$url."&":$url."?";
  143. $url = $url."order_no=$order_no&out_trade_no={$params['out_trade_no']}&total_amount={$params['total_amount']}";
  144. HelperService::httpPost("{$url}", json_encode($data));
  145. Log::record('notifyPlatformAlipay:success');
  146. die('success');
  147. }
  148. Log::record('notifyPlatformAlipay:alipay_url dont have');
  149. die('fail(alipay_url dont have)');
  150. }catch (\Exception $ex){
  151. $datetime = date('Y-m-d H:i:s');
  152. Log::record("[$datetime]notifyPlatformAlipay:".$ex->getMessage());
  153. }
  154. }
  155. private function _validCompanyCode($companyCode){
  156. $AuthCompanyModel = new AuthCompanyModel();
  157. $company = $AuthCompanyModel->getInfo(['company_code'=>"$companyCode"]);
  158. if(empty($company)){
  159. return false;
  160. }
  161. return $company;
  162. }
  163. }