Pay.php 8.3 KB

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