Pay.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. <?php
  2. namespace app\newhome\controller;
  3. use think\Controller;
  4. use think\Db;
  5. use app\user\model\PayPlugin;
  6. use app\user\model\User;
  7. use app\user\model\UserPay;
  8. class Pay extends Controller{
  9. private $payPluginModel, $userModel;
  10. public function _initialize(){
  11. $this->payPluginModel= new PayPlugin();
  12. $this->userModel = new User();
  13. }
  14. public function pay(){
  15. $data = decode($this->request->post());
  16. // $data['i'] = 'com.dashgame.garden.packone';
  17. // $data['t'] = 1;
  18. // $data['u'] = 1704251601802555535;
  19. $iapInfo = Db::name('iap_config')->where(['item_id'=>$data['i']])->find();
  20. if(empty($iapInfo)) return (json(['error'=>1111]));
  21. $plugin = $this->payPluginModel->getPayPluginByType($data['t']);
  22. if(empty($plugin)) return (json(['error'=>1111]));
  23. $biz_content = $this->getAliTradeInfo($iapInfo, $data['u']);
  24. $val = $this->getAliPayInfo($plugin, $biz_content);
  25. return http_build_query($val);
  26. }
  27. public function sdk_notify(){
  28. $data = $this->request->post();
  29. $order_id = $data['order_id'];
  30. $pay_money = $data['pay_money'];
  31. $pay_time = $data['pay_time'];
  32. $exinfo = $data['exinfo'];
  33. $role_id = $data['role_id'];
  34. if($data['sign'] != md5($order_id.$pay_money.$pay_time.$exinfo."o6knhm0BhXBDVn3D"))
  35. {
  36. return json(["errno"=>101, "msg"=>"签名不对"]);
  37. }
  38. $iapInfo = Db::name('iap_config')->where(['item_id'=>$order_id])->find();
  39. if(empty($iapInfo)) return (json(['errno'=>1111, "msg"=>"商品ID错误"]));
  40. $user = Db::name('user')->where(['id'=>$role_id])->find();
  41. if(empty($user)) return (json(['errno'=>1111, 'msg'=>"用户ID错误"]));
  42. $arr = array();
  43. $arr['user_id'] = $role_id;
  44. $arr['pay_id'] = $iapInfo['id'];
  45. $arr['out_trade_no'] = $order_id;
  46. $arr['cost'] = $pay_money;
  47. $arr['create_time'] = date("Y-m-d H:i:s", $pay_time);
  48. Db::name('user_pay')->insert($arr);
  49. return json(['errno'=>1, 'msg'=>""]);
  50. }
  51. public function notify(){
  52. echo 'success';
  53. }
  54. private function getAliTradeInfo($ipa, $user){
  55. $content = [];
  56. $content['subject'] = $ipa['desc'];
  57. $content['out_trade_no'] = $tradeNo = 'D'.getId();
  58. $content['total_amount'] = $ipa['price'];
  59. // $content['total_amount'] = 0.01;
  60. $content['product_code'] = 'QUICK_MSECURITY_PAY';
  61. $content['timeout_express'] = '90m';
  62. $content['body'] = $ipa['desc'];
  63. $userPay = new UserPay();
  64. $userPay->add(['user_id'=>$user, 'cost'=>$ipa['price'], 'pay_id'=>$ipa['id'], 'out_trade_no'=>$tradeNo]);
  65. return json_encode($content);
  66. }
  67. private function getAliPayInfo($plugin, $biz_content){
  68. $params = [];
  69. $params['app_id'] = $plugin['appid'];
  70. $params['method'] = 'alipay.trade.app.pay';
  71. $params['format'] = "JSON";
  72. $params['charset'] = "UTF-8";
  73. $params['version'] = "1.0";
  74. $params['timestamp'] = getCurrentTime();
  75. $params['sign_type'] = "RSA2";
  76. $params['notify_url'] = 'http://'.$_SERVER['SERVER_NAME']._PHP_FILE_.'/'.$this->request->module().'/'.$this->request->controller().'/notify';
  77. $params['biz_content'] = $biz_content;
  78. ksort($params);
  79. $sign = aliSign($plugin['private_key'], getAliSignContent($params));
  80. $params['sign'] = $sign;
  81. foreach ($params as &$value) {
  82. $value = urlencode($value);
  83. }
  84. return $params;
  85. }
  86. public function wxPay()
  87. {
  88. $data = decode($this->request->post());
  89. // $data['i'] = 'com.dashgame.garden.packone';
  90. // $data['t'] = 1;
  91. // $data['u'] = 1704251601802555535;
  92. $iapInfo = Db::name('iap_config')->where(['item_id'=>$data['i']])->find();
  93. if(empty($iapInfo)) return (json(['error'=>1111]));
  94. $user_id = $data['u'];
  95. $price = $iapInfo['price'];
  96. $out_trade_no = 'D'.getId();
  97. $order_url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
  98. $data = array();
  99. $data['appid'] = "wx47450ab76d65a1b3";
  100. $data['mch_id'] = "1495332042";
  101. $data['nonce_str'] = md5(time());
  102. $data['sign_type'] = "MD5";
  103. $data['body'] = $iapInfo['desc'];
  104. $data['out_trade_no'] = $out_trade_no;
  105. $data['total_fee'] = $price*100;
  106. $data['spbill_create_ip'] = $this->getip();
  107. $data['notify_url'] = 'http://'.$_SERVER['SERVER_NAME'].'/wx_notify.php';
  108. $data['trade_type'] = "APP";
  109. $data['attach'] = $user_id;
  110. ksort($data);
  111. // print_r($data);
  112. $data['sign'] = $this->generateSign($data);
  113. $xml = $this->arrayToXml($data);
  114. $opts = array (
  115. 'http' => array(
  116. 'method' => 'POST',
  117. 'header' => "Content-type: application/x-www-form-urlencoded ",
  118. 'content' => $xml
  119. ),
  120. );
  121. $context = stream_context_create($opts);
  122. $html = file_get_contents($order_url, false, $context);
  123. // echo $html;
  124. $xml = simplexml_load_string($html);
  125. if(strval($xml->return_code) != "SUCCESS" || strval($xml->result_code) != "SUCCESS")
  126. {
  127. return (json(['error'=>2]));
  128. }
  129. $pay = array();
  130. $pay['appid'] = strval($xml->appid);
  131. $pay['partnerid'] = strval($xml->mch_id);
  132. $pay['prepayid'] = strval($xml->prepay_id);
  133. $pay['package'] = "Sign=WXPay";
  134. $pay['noncestr'] = md5(time());
  135. $pay['timestamp'] = strval(time());
  136. $pay['sign'] = $this->generateSign($pay);
  137. $userPay = new UserPay();
  138. $userPay->add(['user_id'=>$user_id, 'cost'=>$price, 'pay_id'=>$iapInfo['id'], 'out_trade_no'=>$out_trade_no]);
  139. return (json($pay));
  140. }
  141. function getip() {
  142. $unknown = 'unknown';
  143. if ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] && strcasecmp($_SERVER['HTTP_X_FORWARDED_FOR'], $unknown) ) {
  144. $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  145. } elseif ( isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], $unknown) ) {
  146. $ip = $_SERVER['REMOTE_ADDR'];
  147. }
  148. /*
  149. 处理多层代理的情况
  150. 或者使用正则方式:$ip = preg_match("/[\d\.]{7,15}/", $ip, $matches) ? $matches[0] : $unknown;
  151. */
  152. if (false !== strpos($ip, ','))
  153. $ip = reset(explode(',', $ip));
  154. return $ip;
  155. }
  156. private function generateSign($params)
  157. {
  158. ksort($params);
  159. $stringToBeSigned = "";
  160. $i = 0;
  161. foreach ($params as $k => $v) {
  162. if (false === $this->checkEmpty($v) && "@" != substr($v, 0, 1)) {
  163. // 转换成目标字符集
  164. //$v = $this->characet($v, $this->postCharset);
  165. if ($i == 0) {
  166. $stringToBeSigned .= "$k" . "=" . "$v";
  167. } else {
  168. $stringToBeSigned .= "&" . "$k" . "=" . "$v";
  169. }
  170. $i++;
  171. }
  172. }
  173. unset ($k, $v);
  174. $stringSignTemp = $stringToBeSigned."&key=N6a0xVVV4IyMwQrneiCweaVQ7sypOEbS";
  175. return strtoupper(md5($stringSignTemp));
  176. }
  177. private function checkEmpty($value) {
  178. if (!isset($value))
  179. return true;
  180. if ($value === null)
  181. return true;
  182. if (trim($value) === "")
  183. return true;
  184. return false;
  185. }
  186. private function arrayToXml($arr)
  187. {
  188. $xml = "<xml>\n";
  189. foreach ($arr as $key=>$val)
  190. {
  191. if(is_numeric($val))
  192. {
  193. $xml .= "<".$key.">".$val."</".$key.">\n";
  194. }
  195. else
  196. {
  197. $xml .= "<".$key."><![CDATA[".$val."]]></".$key.">\n";
  198. }
  199. }
  200. $xml .= "</xml>";
  201. return $xml;
  202. }
  203. }