Pay.php 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678
  1. <?php
  2. namespace App\Utils;
  3. use App\Models\User;
  4. use App\Models\Code;
  5. use App\Models\Paylist;
  6. use App\Models\Payback;
  7. use App\Services\Config;
  8. class Pay
  9. {
  10. public static function getHTML($user)
  11. {
  12. $driver = Config::get("payment_system");
  13. switch ($driver) {
  14. case "doiampay":
  15. return Pay::doiampay_html($user);
  16. case "paymentwall":
  17. return Pay::pmw_html($user);
  18. case 'spay':
  19. return Pay::spay_html($user);
  20. case 'zfbjk':
  21. return Pay::zfbjk_html($user);
  22. case 'f2fpay':
  23. return Pay::f2fpay_html($user);
  24. case 'yftpay':
  25. return Pay::yftpay_html($user);
  26. default:
  27. return "";
  28. }
  29. return null;
  30. }
  31. /**
  32. * DoiamPay
  33. * @param User $user User
  34. * @return String HTML
  35. */
  36. public static function doiampay_html(User $user){
  37. return \App\Utils\DoiAMPay::render();
  38. }
  39. private static function spay_html($user)
  40. {
  41. return '
  42. <form action="/user/alipay" method="get" target="_blank" >
  43. <h3>支付宝充值</h3>
  44. <p>充值金额: <input type="text" name="amount" /></p>
  45. <input type="submit" value="提交" />
  46. </form>
  47. ';
  48. }
  49. private static function zfbjk_html($user)
  50. {
  51. return '
  52. <p>请扫码,给我转账来充值,记得备注上 <code>'.$user->id.'</code>。<br></p>
  53. <img src="'.Config::get('zfbjk_qrcodeurl').'"/>
  54. ';
  55. }
  56. private static function f2fpay_html($user)
  57. {
  58. return '
  59. <p><i class="icon icon-lg">monetization_on</i>&nbsp;余额&nbsp;<font color="red" size="5">'.$user->money.'</font>&nbsp;元</p>
  60. <p><img src="/images/qianbai-4.png" height="250" width="200" /></p>
  61. <div class="form-group form-group-label">
  62. <label class="floating-label" for="number">请选择充值金额</label>
  63. <select id="type" class="form-control" name="amount">
  64. <option></option>
  65. <option value="'.Config::get('amount')[0].'">'.Config::get('amount')[0].'元</option>
  66. <option value="'.Config::get('amount')[1].'">'.Config::get('amount')[1].'元</option>
  67. <option value="'.Config::get('amount')[2].'">'.Config::get('amount')[2].'元</option>
  68. <option value="'.Config::get('amount')[3].'">'.Config::get('amount')[3].'元</option>
  69. <option value="'.Config::get('amount')[4].'">'.Config::get('amount')[4].'元</option>
  70. </select>
  71. </div>
  72. <p></p>
  73. <a class="btn btn-flat waves-attach" id="urlChange" ><span class="icon">local_gas_station</span>&nbsp;充值</a>
  74. ';
  75. }
  76. private static function yftpay_html($user)
  77. {
  78. return '
  79. <form action="/user/code/yft" method="post" target="_blank">
  80. <div class="card-inner">
  81. <p class="card-heading">在线充值</p>
  82. <div class="form-group form-group-label">
  83. <label class="floating-label" for="price">充值金额</label>
  84. <input class="form-control" id="price" name="price" type="text">
  85. </div>
  86. </div>
  87. <div class="card-action">
  88. <div class="card-action-btn pull-left">
  89. <button type="submit" class="btn btn-flat waves-attach" id="yftCoin" ><span class="icon">check</span>&nbsp;充值</button>
  90. </div>
  91. </div>
  92. </form>
  93. ';
  94. }
  95. private static function pmw_html($user)
  96. {
  97. \Paymentwall_Config::getInstance()->set(array(
  98. 'api_type' => \Paymentwall_Config::API_VC,
  99. 'public_key' => Config::get('pmw_publickey'),
  100. 'private_key' => Config::get('pmw_privatekey')
  101. ));
  102. $widget = new \Paymentwall_Widget(
  103. $user->id, // id of the end-user who's making the payment
  104. Config::get('pmw_widget'), // widget code, e.g. p1; can be picked inside of your merchant account
  105. array(), // array of products - leave blank for Virtual Currency API
  106. array(
  107. 'email' => $user->email,
  108. 'history'=>
  109. array(
  110. 'registration_date'=>strtotime($user->reg_date),
  111. 'registration_ip'=>$user->reg_ip,
  112. 'payments_number'=>Code::where('userid', '=', $user->id)->where('type', '=', -1)->count(),
  113. 'membership'=>$user->class),
  114. 'customer'=>array(
  115. 'username'=>$user->user_name
  116. )
  117. ) // additional parameters
  118. );
  119. return $widget->getHtmlCode(array("height"=>Config::get('pmw_height'),"width"=>"100%"));
  120. }
  121. private static function spay_gen($user, $amount)
  122. {
  123. /**************************请求参数**************************/
  124. $alipay_config = Spay_tool::getConfig();
  125. $pl = new Paylist();
  126. $pl->userid = $user->id;
  127. $pl->total = $amount;
  128. $pl->save();
  129. //商户订单号,商户网站订单系统中唯一订单号,必填
  130. $out_trade_no = $pl->id;
  131. //订单名称,必填
  132. $subject = $pl->id."UID".$user->id." 充值".$amount."元";
  133. //付款金额,必填
  134. $total_fee = (float)$amount;
  135. //商品描述,可空
  136. $body = $user->id;
  137. /************************************************************/
  138. //构造要请求的参数数组,无需改动
  139. $parameter = array(
  140. "service" => "create_direct_pay_by_user",
  141. "partner" => trim($alipay_config['partner']),
  142. "notify_url" => $alipay_config['notify_url'],
  143. "return_url" => $alipay_config['return_url'],
  144. "out_trade_no" => $out_trade_no,
  145. "total_fee" => $total_fee
  146. );
  147. //建立请求
  148. $alipaySubmit = new Spay_submit($alipay_config);
  149. $html_text = $alipaySubmit->buildRequestForm($parameter, "get", "确认");
  150. echo $html_text;
  151. exit(0);
  152. }
  153. private static function get_alipay_config()
  154. {
  155. //获取支付宝接口配置
  156. $config = array (
  157. //签名方式,默认为RSA2(RSA2048)
  158. 'sign_type' => "RSA2",
  159. //支付宝公钥
  160. 'alipay_public_key' => Config::get("alipay_public_key"),
  161. //商户私钥
  162. 'merchant_private_key' => Config::get("merchant_private_key"),
  163. //编码格式
  164. 'charset' => "UTF-8",
  165. //支付宝网关
  166. 'gatewayUrl' => "https://openapi.alipay.com/gateway.do",
  167. //应用ID
  168. 'app_id' => Config::get("f2fpay_app_id"),
  169. //异步通知地址,只有扫码支付预下单可用
  170. 'notify_url' => Config::get("baseUrl")."/pay_callback",
  171. //最大查询重试次数
  172. 'MaxQueryRetry' => "10",
  173. //查询间隔
  174. 'QueryDuration' => "3"
  175. );
  176. return $config;
  177. }
  178. public static function alipay_get_qrcode($user, $amount, &$qrPay)
  179. {
  180. //创建订单
  181. $pl = new Paylist();
  182. $pl->userid = $user->id;
  183. $pl->total = $amount;
  184. $pl->save();
  185. //获取支付宝接口配置
  186. $config = Pay::get_alipay_config();
  187. //$timestamp
  188. /**************************请求参数**************************/
  189. // (必填) 商户网站订单系统中唯一订单号,64个字符以内,只能包含字母、数字、下划线,
  190. // 需保证商户系统端不能重复,建议通过数据库sequence生成,
  191. //$outTradeNo = "qrpay".date('Ymdhis').mt_rand(100,1000);
  192. $outTradeNo = $pl->id;
  193. // (必填) 订单标题,粗略描述用户的支付目的。如“xxx品牌xxx门店当面付扫码消费”
  194. $subject = "¥".$pl->total." - ".Config::get("appName")." - {$user->user_name}({$user->email})";
  195. // (必填) 订单总金额,单位为元,不能超过1亿元
  196. // 如果同时传入了【打折金额】,【不可打折金额】,【订单总金额】三者,则必须满足如下条件:【订单总金额】=【打折金额】+【不可打折金额】
  197. $totalAmount = $pl->total;
  198. // (不推荐使用) 订单可打折金额,可以配合商家平台配置折扣活动,如果订单部分商品参与打折,可以将部分商品总价填写至此字段,默认全部商品可打折
  199. // 如果该值未传入,但传入了【订单总金额】,【不可打折金额】 则该值默认为【订单总金额】- 【不可打折金额】
  200. //String discountableAmount = "1.00"; //
  201. // (可选) 订单不可打折金额,可以配合商家平台配置折扣活动,如果酒水不参与打折,则将对应金额填写至此字段
  202. // 如果该值未传入,但传入了【订单总金额】,【打折金额】,则该值默认为【订单总金额】-【打折金额】
  203. $undiscountableAmount = "0.01";
  204. // 卖家支付宝账号ID,用于支持一个签约账号下支持打款到不同的收款账号,(打款到sellerId对应的支付宝账号)
  205. // 如果该字段为空,则默认为与支付宝签约的商户的PID,也就是appid对应的PID
  206. //$sellerId = "";
  207. // 订单描述,可以对交易或商品进行一个详细地描述,比如填写"购买商品2件共15.00元"
  208. $body = "用户名:".$user->user_name." 用户ID:".$user->id." 用户充值共计".$pl->total."元";
  209. //商户操作员编号,添加此参数可以为商户操作员做销售统计
  210. $operatorId = "bak_admin0001";
  211. // (可选) 商户门店编号,通过门店号和商家后台可以配置精准到门店的折扣信息,详询支付宝技术支持
  212. $storeId = "bak_store001";
  213. // 支付宝的店铺编号
  214. //$alipayStoreId= "2016041400077000000003314986";
  215. // 业务扩展参数,目前可添加由支付宝分配的系统商编号(通过setSysServiceProviderId方法),系统商开发使用,详情请咨询支付宝技术支持
  216. $providerId = ""; //系统商pid,作为系统商返佣数据提取的依据
  217. $extendParams = new \ExtendParams();
  218. $extendParams->setSysServiceProviderId($providerId);
  219. $extendParamsArr = $extendParams->getExtendParams();
  220. // 支付超时,线下扫码交易定义为5分钟
  221. $timeExpress = "5m";
  222. // 商品明细列表,需填写购买商品详细信息,
  223. $goodsDetailList = array();
  224. // 创建一个商品信息,参数含义分别为商品id(使用国标)、名称、单价(单位为分)、数量,如果需要添加商品类别,详见GoodsDetail
  225. $goods1 = new \GoodsDetail();
  226. $goods1->setGoodsId($pl->total);
  227. $goods1->setGoodsName("充值");
  228. $goods1->setPrice($pl->total);
  229. $goods1->setQuantity(1);
  230. //得到商品1明细数组
  231. $goods1Arr = $goods1->getGoodsDetail();
  232. $goodsDetailList = array($goods1Arr);
  233. //第三方应用授权令牌,商户授权系统商开发模式下使用
  234. $appAuthToken = "";//根据真实值填写
  235. // 创建请求builder,设置请求参数
  236. $qrPayRequestBuilder = new \AlipayTradePrecreateContentBuilder();
  237. $qrPayRequestBuilder->setOutTradeNo($outTradeNo);
  238. $qrPayRequestBuilder->setTotalAmount($totalAmount);
  239. $qrPayRequestBuilder->setTimeExpress($timeExpress);
  240. $qrPayRequestBuilder->setSubject($subject);
  241. $qrPayRequestBuilder->setBody($body);
  242. $qrPayRequestBuilder->setUndiscountableAmount($undiscountableAmount);
  243. $qrPayRequestBuilder->setExtendParams($extendParamsArr);
  244. $qrPayRequestBuilder->setGoodsDetailList($goodsDetailList);
  245. $qrPayRequestBuilder->setStoreId($storeId);
  246. $qrPayRequestBuilder->setOperatorId($operatorId);
  247. //$qrPayRequestBuilder->setAlipayStoreId($alipayStoreId);
  248. $qrPayRequestBuilder->setAppAuthToken($appAuthToken);
  249. // 调用qrPay方法获取当面付应答
  250. $qrPay = new \AlipayTradeService($config);
  251. $qrPayResult = $qrPay->qrPay($qrPayRequestBuilder);
  252. return $qrPayResult;
  253. }
  254. private static function f2fpay_gen($user, $amount)
  255. {
  256. //$qrPayResult = Pay::query_alipay_order(2017052112230123456);
  257. //return ;
  258. //生成二维码
  259. $qrPayResult = Pay::alipay_get_qrcode($user, $amount, $qrPay);
  260. // 根据状态值进行业务处理
  261. switch ($qrPayResult->getTradeStatus()){
  262. case "SUCCESS":
  263. echo "支付金额: RMB ".$amount." 元";
  264. echo "确认无误后请用支付宝App扫描二维码支付:"."<br>---------------------------------------<br>";
  265. $response = $qrPayResult->getResponse();
  266. $qrcode = $qrPay->create_erweima($response->qr_code);
  267. echo $qrcode."<br>";
  268. break;
  269. case "FAILED":
  270. echo "支付宝创建订单二维码失败!!!"."<br>--------------------------<br>";
  271. if(!empty($qrPayResult->getResponse())){
  272. print_r($qrPayResult->getResponse());
  273. }
  274. echo "请使用其他方式付款。";
  275. break;
  276. case "UNKNOWN":
  277. echo "系统异常,状态未知!!!"."<br>--------------------------<br>";
  278. if(!empty($qrPayResult->getResponse())){
  279. print_r($qrPayResult->getResponse());
  280. }
  281. echo "请使用其他方式付款。";
  282. break;
  283. default:
  284. echo "创建订单二维码返回异常!!!"."<br>--------------------------<br>";
  285. echo "请使用其他方式付款。";
  286. break;
  287. }
  288. if ($qrPayResult->getTradeStatus()) {
  289. sleep(1);
  290. echo "轮询处理:";
  291. }
  292. return ;
  293. }
  294. public static function getGen($user, $amount)
  295. {
  296. $driver = Config::get("payment_system");
  297. switch ($driver) {
  298. case "paymentwall":
  299. return Pay::pmw_html();
  300. case 'spay':
  301. return Pay::spay_gen($user, $amount);
  302. case 'zfbjk':
  303. return Pay::alipay_html();
  304. case 'f2fpay':
  305. return Pay::f2fpay_gen($user, $amount);
  306. default:
  307. return "";
  308. }
  309. return null;
  310. }
  311. private static function spay_callback()
  312. {
  313. //计算得出通知验证结果
  314. $alipayNotify = new Spay_notify(Spay_tool::getConfig());
  315. $verify_result = $alipayNotify->verifyNotify();
  316. if ($verify_result) {//验证成功
  317. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  318. //请在这里加上商户的业务逻辑程序代
  319. //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
  320. //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
  321. //商户订单号
  322. $out_trade_no = $_POST['out_trade_no'];
  323. //支付宝交易号
  324. $trade_no = $_POST['trade_no'];
  325. //交易状态
  326. $trade_status = $_POST['trade_status'];
  327. $trade = Paylist::where("id", '=', $out_trade_no)->where('status', 0)->where('total', $_POST['total_fee'])->first();
  328. if ($trade == null) {
  329. exit("success");
  330. }
  331. $trade->tradeno = $trade_no;
  332. $trade->status = 1;
  333. $trade->save();
  334. //status
  335. $trade_status = $_POST['trade_status'];
  336. if ($_POST['trade_status'] == 'TRADE_FINISHED') {
  337. //判断该笔订单是否在商户网站中已经做过处理
  338. //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
  339. //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
  340. //如果有做过处理,不执行商户的业务程序
  341. //注意:
  342. //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
  343. //调试用,写文本函数记录程序运行情况是否正常
  344. //logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
  345. $user=User::find($trade->userid);
  346. $user->money=$user->money+$_POST['total_fee'];
  347. $user->save();
  348. $codeq=new Code();
  349. $codeq->code="支付宝 充值";
  350. $codeq->isused=1;
  351. $codeq->type=-1;
  352. $codeq->number=$_POST['total_fee'];
  353. $codeq->usedatetime=date("Y-m-d H:i:s");
  354. $codeq->userid=$user->id;
  355. $codeq->save();
  356. if ($user->ref_by!=""&&$user->ref_by!=0&&$user->ref_by!=null) {
  357. $gift_user=User::where("id", "=", $user->ref_by)->first();
  358. $gift_user->money=($gift_user->money+($codeq->number*(Config::get('code_payback')/100)));
  359. $gift_user->save();
  360. $Payback=new Payback();
  361. $Payback->total=$_POST['total_fee'];
  362. $Payback->userid=$user->id;
  363. $Payback->ref_by=$user->ref_by;
  364. $Payback->ref_get=$codeq->number*(Config::get('code_payback')/100);
  365. $Payback->datetime=time();
  366. $Payback->save();
  367. }
  368. } elseif ($_POST['trade_status'] == 'TRADE_SUCCESS') {
  369. //判断该笔订单是否在商户网站中已经做过处理
  370. //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
  371. //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
  372. //如果有做过处理,不执行商户的业务程序
  373. //注意:
  374. //付款完成后,支付宝系统发送该交易状态通知
  375. //调试用,写文本函数记录程序运行情况是否正常
  376. //logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
  377. $user=User::find($trade->userid);
  378. $user->money=$user->money+$_POST['total_fee'];
  379. $user->save();
  380. $codeq=new Code();
  381. $codeq->code="支付宝 充值";
  382. $codeq->isused=1;
  383. $codeq->type=-1;
  384. $codeq->number=$_POST['total_fee'];
  385. $codeq->usedatetime=date("Y-m-d H:i:s");
  386. $codeq->userid=$user->id;
  387. $codeq->save();
  388. if ($user->ref_by!=""&&$user->ref_by!=0&&$user->ref_by!=null) {
  389. $gift_user=User::where("id", "=", $user->ref_by)->first();
  390. $gift_user->money=($gift_user->money+($codeq->number*(Config::get('code_payback')/100)));
  391. $gift_user->save();
  392. $Payback=new Payback();
  393. $Payback->total=$_POST['total_fee'];
  394. $Payback->userid=$user->id;
  395. $Payback->ref_by=$user->ref_by;
  396. $Payback->ref_get=$codeq->number*(Config::get('code_payback')/100);
  397. $Payback->datetime=time();
  398. $Payback->save();
  399. }
  400. }
  401. //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
  402. echo "success"; //请不要修改或删除
  403. if (Config::get('enable_donate') == 'true') {
  404. if ($user->is_hide == 1) {
  405. Telegram::Send("姐姐姐姐,一位不愿透露姓名的大老爷给我们捐了 ".$codeq->number." 元呢~");
  406. } else {
  407. Telegram::Send("姐姐姐姐,".$user->user_name." 大老爷给我们捐了 ".$codeq->number." 元呢~");
  408. }
  409. }
  410. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  411. } else {
  412. //验证失败
  413. echo "fail";
  414. //调试用,写文本函数记录程序运行情况是否正常
  415. //logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
  416. }
  417. }
  418. private static function pmw_callback()
  419. {
  420. if (Config::get('pmw_publickey')!="") {
  421. \Paymentwall_Config::getInstance()->set(array(
  422. 'api_type' => \Paymentwall_Config::API_VC,
  423. 'public_key' => Config::get('pmw_publickey'),
  424. 'private_key' => Config::get('pmw_privatekey')
  425. ));
  426. $pingback = new \Paymentwall_Pingback($_GET, $_SERVER['REMOTE_ADDR']);
  427. if ($pingback->validate()) {
  428. $virtualCurrency = $pingback->getVirtualCurrencyAmount();
  429. if ($pingback->isDeliverable()) {
  430. // deliver the virtual currency
  431. } elseif ($pingback->isCancelable()) {
  432. // withdraw the virual currency
  433. }
  434. $user=User::find($pingback->getUserId());
  435. $user->money=$user->money+$pingback->getVirtualCurrencyAmount();
  436. $user->save();
  437. $codeq=new Code();
  438. $codeq->code="Payment Wall 充值";
  439. $codeq->isused=1;
  440. $codeq->type=-1;
  441. $codeq->number=$pingback->getVirtualCurrencyAmount();
  442. $codeq->usedatetime=date("Y-m-d H:i:s");
  443. $codeq->userid=$user->id;
  444. $codeq->save();
  445. if ($user->ref_by!=""&&$user->ref_by!=0&&$user->ref_by!=null) {
  446. $gift_user=User::where("id", "=", $user->ref_by)->first();
  447. $gift_user->money=($gift_user->money+($codeq->number*(Config::get('code_payback')/100)));
  448. $gift_user->save();
  449. $Payback=new Payback();
  450. $Payback->total=$pingback->getVirtualCurrencyAmount();
  451. $Payback->userid=$user->id;
  452. $Payback->ref_by=$user->ref_by;
  453. $Payback->ref_get=$codeq->number*(Config::get('code_payback')/100);
  454. $Payback->datetime=time();
  455. $Payback->save();
  456. }
  457. echo 'OK'; // Paymentwall expects response to be OK, otherwise the pingback will be resent
  458. if (Config::get('enable_donate') == 'true') {
  459. if ($user->is_hide == 1) {
  460. Telegram::Send("姐姐姐姐,一位不愿透露姓名的大老爷给我们捐了 ".$codeq->number." 元呢~");
  461. } else {
  462. Telegram::Send("姐姐姐姐,".$user->user_name." 大老爷给我们捐了 ".$codeq->number." 元呢~");
  463. }
  464. }
  465. } else {
  466. echo $pingback->getErrorSummary();
  467. }
  468. } else {
  469. echo 'error';
  470. }
  471. }
  472. private static function zfbjk_callback($request)
  473. {
  474. //您在www.zfbjk.com的商户ID
  475. $alidirect_pid = Config::get("zfbjk_pid");
  476. //您在www.zfbjk.com的商户密钥
  477. $alidirect_key = Config::get("zfbjk_key");
  478. $tradeNo = $request->getParam('tradeNo');
  479. $Money = $request->getParam('Money');
  480. $title = $request->getParam('title');
  481. $memo = $request->getParam('memo');
  482. $alipay_account = $request->getParam('alipay_account');
  483. $Gateway = $request->getParam('Gateway');
  484. $Sign = $request->getParam('Sign');
  485. if (!is_numeric($title)) {
  486. exit("fail");
  487. }
  488. if (strtoupper(md5($alidirect_pid . $alidirect_key . $tradeNo . $Money . $title . $memo)) == strtoupper($Sign)) {
  489. $trade = Paylist::where("tradeno", '=', $tradeNo)->first();
  490. if ($trade != null) {
  491. exit("success");
  492. } else {
  493. $user=User::where('id', '=', $title)->first();
  494. if ($user == null) {
  495. exit("IncorrectOrder");
  496. }
  497. $pl = new Paylist();
  498. $pl->userid=$title;
  499. $pl->tradeno=$tradeNo;
  500. $pl->total=$Money;
  501. $pl->datetime=time();
  502. $pl->status=1;
  503. $pl->save();
  504. $user->money=$user->money+$Money;
  505. $user->save();
  506. $codeq=new Code();
  507. $codeq->code="支付宝充值";
  508. $codeq->isused=1;
  509. $codeq->type=-1;
  510. $codeq->number=$Money;
  511. $codeq->usedatetime=date("Y-m-d H:i:s");
  512. $codeq->userid=$user->id;
  513. $codeq->save();
  514. if ($user->ref_by!=""&&$user->ref_by!=0&&$user->ref_by!=null) {
  515. $gift_user=User::where("id", "=", $user->ref_by)->first();
  516. $gift_user->money=($gift_user->money+($codeq->number*(Config::get('code_payback')/100)));
  517. $gift_user->save();
  518. $Payback=new Payback();
  519. $Payback->total=$Money;
  520. $Payback->userid=$user->id;
  521. $Payback->ref_by=$user->ref_by;
  522. $Payback->ref_get=$codeq->number*(Config::get('code_payback')/100);
  523. $Payback->datetime=time();
  524. $Payback->save();
  525. }
  526. if (Config::get('enable_donate') == 'true') {
  527. if ($user->is_hide == 1) {
  528. Telegram::Send("姐姐姐姐,一位不愿透露姓名的大老爷给我们捐了 ".$codeq->number." 元呢~");
  529. } else {
  530. Telegram::Send("姐姐姐姐,".$user->user_name." 大老爷给我们捐了 ".$codeq->number." 元呢~");
  531. }
  532. }
  533. exit("Success");
  534. }
  535. } else {
  536. exit('Fail');
  537. }
  538. }
  539. private static function f2fpay_callback()
  540. {
  541. $aop = new \AopClient();
  542. $alipayrsaPublicKey = Config::get("alipay_public_key");
  543. $aop->alipayrsaPublicKey = $alipayrsaPublicKey;
  544. //获取支付宝返回参数
  545. $arr=$_POST;
  546. //调用验签的方法
  547. $result = $aop->rsaCheckV1($arr,$alipayrsaPublicKey,$_POST['sign_type']);
  548. if($result) {//验证成功
  549. //系统订单号
  550. $out_trade_no = $_POST['out_trade_no'];
  551. //支付宝交易号
  552. $trade_no = $_POST['trade_no'];
  553. //交易状态
  554. $trade_status = $_POST['trade_status'];
  555. // 查询系统订单
  556. $alipayPID = Config::get("f2fpay_p_id");
  557. if ($_POST['seller_id']!=$alipayPID){
  558. exit("success");
  559. }
  560. $trade = Paylist::where("id", '=', $out_trade_no)->where('status', 0)->where('total', $_POST['total_amount'])->first();
  561. if ($trade == null) {//没有符合的订单,或订单已经处理
  562. exit("success");
  563. }
  564. //订单查询到,处理业务
  565. if($trade_status == 'TRADE_FINISHED'||$trade_status == 'TRADE_SUCCESS') {
  566. //判断该笔订单是否在商户网站中已经做过处理
  567. //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
  568. //请务必判断请求时的total_amount与通知时获取的total_fee为一致的
  569. //如果有做过处理,不执行商户的业务程序
  570. //注意:
  571. //付款完成后,支付宝系统发送该交易状态通知
  572. //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
  573. //更新订单状态
  574. $trade->tradeno = $trade_no;
  575. $trade->status = 1;
  576. $trade->save();
  577. //更新用户账户
  578. $user=User::find($trade->userid);
  579. $user->money=$user->money+$_POST['total_amount'];
  580. if ($user->class==0) {
  581. $user->class_expire=date("Y-m-d H:i:s", time());
  582. $user->class_expire=date("Y-m-d H:i:s", strtotime($user->class_expire)+86400);
  583. $user->class=1;
  584. }
  585. $user->save();
  586. //更新充值(捐赠)记录
  587. $codeq=new Code();
  588. $codeq->code="支付宝 充值";
  589. $codeq->isused=1;
  590. $codeq->type=-1;
  591. $codeq->number=$_POST['total_amount'];
  592. $codeq->usedatetime=date("Y-m-d H:i:s");
  593. $codeq->userid=$user->id;
  594. $codeq->save();
  595. //更新返利
  596. if ($user->ref_by!=""&&$user->ref_by!=0&&$user->ref_by!=null) {
  597. $gift_user=User::where("id", "=", $user->ref_by)->first();
  598. $gift_user->money=($gift_user->money+($codeq->number*(Config::get('code_payback')/100)));
  599. $gift_user->save();
  600. $Payback=new Payback();
  601. $Payback->total=$_POST['total_amount'];
  602. $Payback->userid=$user->id;
  603. $Payback->ref_by=$user->ref_by;
  604. $Payback->ref_get=$codeq->number*(Config::get('code_payback')/100);
  605. $Payback->datetime=time();
  606. $Payback->save();
  607. }
  608. if (Config::get('enable_donate') == 'true') {
  609. if ($user->is_hide == 1) {
  610. Telegram::Send("一位不愿透露姓名的大老爷给我们捐了 ".$codeq->number." 元!");
  611. } else {
  612. Telegram::Send($user->user_name." 大老爷给我们捐了 ".$codeq->number." 元!");
  613. }
  614. }
  615. //业务处理完毕,向支付宝系统返回成功
  616. echo "success"; //请不要修改或删除
  617. }
  618. }else {
  619. //验证失败
  620. echo "fail"; //请不要修改或删除
  621. }
  622. }
  623. public static function callback($request)
  624. {
  625. $driver = Config::get("payment_system");
  626. switch ($driver) {
  627. case "paymentwall":
  628. return Pay::pmw_callback();
  629. case 'spay':
  630. return Pay::spay_callback();
  631. case 'zfbjk':
  632. return Pay::zfbjk_callback($request);
  633. case 'f2fpay':
  634. return Pay::f2fpay_callback();
  635. default:
  636. return "";
  637. }
  638. return null;
  639. }
  640. }