Demo.php 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013
  1. <?php
  2. /**
  3. * api登录控制器
  4. */
  5. namespace app\api\controller\v1;
  6. use app\common\logic\Pay as PayLogic;
  7. use app\common\logic\PayCallback;
  8. use app\common\model\Members;
  9. use app\common\model\Pay;
  10. use app\common\model\PayCpinfo;
  11. use think\Config;
  12. use think\Controller;
  13. use think\Db;
  14. use tree\SignaTure;
  15. class Demo extends Controller
  16. {
  17. public function a()
  18. {
  19. // dump($_SERVER['HTTP_X_FORWARDED_FOR'])."----";
  20. //dump($_SERVER["REMOTE_ADDR"]);die;
  21. dump(request()->ip());die;
  22. if(!empty($_SERVER['HTTP_CLIENT_IP'])){
  23. $cip = $_SERVER['HTTP_CLIENT_IP'];
  24. }
  25. else if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
  26. $cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
  27. }
  28. else if(!empty($_SERVER["REMOTE_ADDR"])){
  29. $cip = $_SERVER["REMOTE_ADDR"];
  30. }else{
  31. $cip = '';
  32. }
  33. preg_match("/[\d\.]{7,15}/", $cip, $cips);
  34. $cip = isset($cips[0]) ? $cips[0] : 'unknown';
  35. // unset($cips);
  36. dump( $cips);die;
  37. $b = $this->zfb();
  38. $result1['mweb_url'] = $b;
  39. $result['xzzfbzf_param'] = $result1;
  40. $result['orderid'] = 1;
  41. $result['referer'] = "com.yiyou.zfb";
  42. $this->jsonResult($result, 1, '订单生成成功',false);
  43. }
  44. public function zfb()
  45. {
  46. // $orderid = makeOrderid();
  47. // $productname = "产品名称";
  48. // $real_amount = 0.01;
  49. // $payData['orderid'] = $orderid;
  50. // $payData['real_amount'] =$real_amount;
  51. // $payData['productname'] = $productname;
  52. // $payData['productdesc'] = "";
  53. // $payData['status'] = 0;
  54. // $payData['create_time'] = NOW_TIMESTAMP;
  55. // Db::name("cy_demo")->insert($payData);
  56. $consumerCreateIp = $this->getUserIp(); //需上传用户真实ip
  57. $key = 'F6LKdnnlwPYxpHbINQMVij9RVkVlnW3I';
  58. $req=array();
  59. $req["appId"] = '159463067783992';
  60. $req["deviceType"] = '0601';
  61. $req["frontNotifyUrl"] = 'http://sdkapi.46yx.com/v1.pay_notify/zfbxjzfipaynow.html';//前台通知,三方支付宝0模式有效,官方支付宝0、1模式有效,微信0模式有效
  62. $req["funcode"] = 'WP001';
  63. $req["mhtCharset"] = 'UTF-8';
  64. $req["mhtCurrencyType"] = '156';
  65. $req["mhtOrderAmt"] = 0.1*100;
  66. $req["mhtOrderDetail"] = '订单支付';
  67. $req["mhtOrderName"] = '产品名称';
  68. $req["mhtOrderNo"] = makeOrderid();
  69. $req["mhtOrderStartTime"] = date("YmdHis");
  70. $req["mhtOrderTimeOut"] = '3600';
  71. $req["mhtOrderType"] = '01';
  72. $req["mhtReserved"] = "test";
  73. $req["mhtSignType"] = 'MD5';
  74. $req["notifyUrl"] = 'http://sdkapi.46yx.com/v1.pay_notify/zfbxjzfipaynow.html';
  75. $req["outputType"] = 1;// 0 默认值
  76. $req["payChannelType"] = 12; //12 支付宝 //13 微信 //20 银联 //25 手Q
  77. $req["version"] = "1.0.0";
  78. $req["consumerCreateIp"] = $consumerCreateIp; //微信必填// outputType=2时 无须上送该值
  79. $req_str = $this -> getToStr($req, $key);
  80. $service = 'https://pay.ipaynow.cn';
  81. $res = $this -> post($service, $req_str);
  82. $code = (bool)stripos($res, '&tn=');
  83. if($code) {
  84. $arr = explode('&', $res);
  85. $gettn = '';
  86. foreach($arr as $v) {
  87. $tn = explode('=', $v);
  88. if($tn[0] == 'tn'){
  89. $gettn = $tn[1];
  90. }
  91. }
  92. //注意
  93. //支付宝ISV返回的tn urldecode函数会自动转义,导致tn解码不正确
  94. // 1、&not被转义,显示成﹁。2、&times会被转义成 X
  95. // if(strpos($gettn,'notify_url')!== false){
  96. // $gettn=str_replace("notify_url","ampnotify_url",$gettn);
  97. // $gettn=str_replace("timestamp","amptimestamp",$gettn);
  98. // }
  99. echo urldecode($gettn);
  100. $tn=urldecode($gettn);
  101. echo "请点击链接进行支付:<a href='". urldecode($gettn) ."'>点我支付</a>";
  102. // echo "请点击链接进行支付:<a href='$tn'>点我支付</a>";
  103. // echo "<iframe frameborder='no' src='$tn'></iframe>";
  104. } else {
  105. echo $res;
  106. }
  107. // print_r($req);die;
  108. // $req_str = $this -> getToStr($req, $key);
  109. // $service = 'https://pay.ipaynow.cn';
  110. // header("location:".$service."?".$req_str);
  111. // die();
  112. // $urlPay = $service."?".$req_str;
  113. // return $urlPay;
  114. // $result1['mweb_url'] = htmlspecialchars($urlPay);
  115. // $result['xzzfbzf_param'] = $result1;
  116. // $result['orderid'] = makeOrderid();
  117. // $result['referer'] = "com.yiyou.zfb";
  118. // $this->jsonResult($result, 1, '订单生成成功',false);
  119. // return $result1;
  120. }
  121. public function post($url, $data)
  122. {
  123. $curl = curl_init(); // 启动一个CURL会话
  124. curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
  125. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
  126. //curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
  127. curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器
  128. //curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
  129. curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
  130. curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
  131. curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包
  132. curl_setopt($curl, CURLOPT_TIMEOUT, 40); // 设置超时限制防止死循环
  133. curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
  134. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
  135. $tmpInfo = curl_exec($curl); // 执行操作
  136. if (curl_errno($curl)) {
  137. echo 'Errno'.curl_error($curl);
  138. echo curl_errno($curl);//捕抓异常
  139. }
  140. curl_close($curl); // 关闭CURL会话
  141. return $tmpInfo; // 返回数据
  142. }
  143. //获取参数
  144. function getDate($arr) {
  145. $result = array();
  146. $funcode = $arr['funcode'];
  147. foreach($arr as $key => $value) {
  148. if (($funcode=='WP001')&&!($key=='mhtSignature'||$key=='signature')){
  149. $result[$key]=$value;
  150. continue;
  151. }
  152. if(($funcode== 'N001'||$funcode=='N002')&&!($key== 'signature')){
  153. $result[$key]=$value;
  154. continue;
  155. }
  156. if (($funcode=='MQ002')&&!($key=='mhtSignature'||$key=='signature')) {
  157. $result[$key]=$value;
  158. continue;
  159. }
  160. }
  161. return $result;
  162. }
  163. //获取签名
  164. function createSignaTure($arr, $key) {
  165. $date = $this -> getDate($arr);
  166. ksort($date);
  167. $str = '';
  168. foreach($date as $k => $v) {
  169. if($v != '') {
  170. $str .= $k.'='.$v.'&';
  171. }
  172. }
  173. $str .= strtolower(md5($key));
  174. return(strtolower(md5($str)));
  175. }
  176. //获取请求参数串
  177. function getToStr($arr, $key) {
  178. $date = $this -> getDate($arr);
  179. $info = $this -> createSignaTure($arr, $key);
  180. $str = '';
  181. foreach($date as $k => $v) {
  182. if($v != '') {
  183. $str .= $k.'='.urlencode($v).'&';
  184. }
  185. }
  186. $str .= 'mhtSignature'.'='.$info;
  187. log_message($str."\r\n",'log',LOG_PATH . '../paylog/');
  188. //file_put_contents('../baowen.log', $str."\r\n");
  189. return $str;
  190. }
  191. //获取真实IP,可以根据实际情况自行获取
  192. function getUserIp() {
  193. $info = file_get_contents('http://myip.ipip.net');
  194. $ipstr = explode(':',$info);
  195. $ip = explode(' ', $ipstr[1]);
  196. return $ip[0];
  197. }
  198. public function zfbalipays() {
  199. //返回的参数
  200. $res = file_get_contents('php://input');
  201. //写入日志
  202. log_message('现在支付回调参数:'.$res,'log',LOG_PATH . '../paylog/');
  203. $Arr = array();
  204. $res = explode('&', $res);
  205. //写入日志
  206. log_message('现在支付explode处理后的回调参数:'.print_r($res,true),'log',LOG_PATH . '../paylog/');
  207. foreach($res as $v) {
  208. $value = explode('=', $v);
  209. $Arr[$value[0]] = urldecode($value[1]);
  210. }
  211. $signatrue = $this->getIpaynowSignTrue($Arr,'F6LKdnnlwPYxpHbINQMVij9RVkVlnW3I');
  212. if($signatrue == $Arr['signature']) {
  213. $orderid = $Arr['mhtOrderNo'];
  214. $mhtOrderAmt= $Arr['mhtOrderAmt']/100; //商户订单交易金额,以分为单位
  215. //订单编号不为空时
  216. if(!empty($orderid)){
  217. log_message('现在支付回调参数:'.print_r($orderid,true),'log',LOG_PATH . '../paylog/');
  218. //更新订单状态处理
  219. // $this->updateOrder($orderid,$mhtOrderAmt);
  220. }
  221. //异步通知验签通过,在此处写业务逻辑
  222. echo 'success=Y';
  223. } else {
  224. //写入日志
  225. log_message('现在支付签名验证失败','error',LOG_PATH . '../paylog/');
  226. //异步通知验签失败,在此处写业务逻辑
  227. echo 'success=N';
  228. }
  229. }
  230. /**
  231. * 对现在支付回调的请求报文做签名验证,
  232. * copy现在支付demo代码中controller.php的getSignTrue方法
  233. *
  234. * @param $Arr array 报文参数
  235. * @param $key string
  236. *
  237. * @return mix
  238. */
  239. private function getIpaynowSignTrue( $Arr, $key )
  240. {
  241. if( !empty($Arr) ) {
  242. ksort($Arr);
  243. $str = '';
  244. foreach( $Arr as $k => $v) {
  245. if( $v == '' || $k == 'signature') {
  246. continue;
  247. }
  248. $str .= $k.'='.$v.'&';
  249. }
  250. if( $key == 'post' ) {
  251. return substr($str, 0, -1);
  252. } else {
  253. return strtolower(md5($str.md5($key)));
  254. }
  255. }
  256. return false;
  257. }
  258. public function zf()
  259. {
  260. vendor('alipayAop.AopSdk');
  261. $aop = new \AopClient ();
  262. $aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
  263. $aop->appId = '2021002156644399';
  264. $aop->rsaPrivateKey = file_get_contents(Config::get('alipayAop')['private_key']);
  265. $aop->alipayrsaPublicKey = file_get_contents(Config::get('alipayAop')['alipay_public_key']);
  266. $aop->apiVersion = '1.0';
  267. $aop->signType = 'RSA2';
  268. $aop->postCharset='UTF-8';
  269. $aop->format='json';
  270. $object = new \stdClass();
  271. $object->out_trade_no = makeOrderid();
  272. $object->total_amount = 1;
  273. $object->subject = '测试商品';
  274. $json = json_encode($object);
  275. $request = new \AlipayTradePrecreateRequest();
  276. $request->setNotifyUrl('');
  277. $request->setBizContent($json);
  278. $result = $aop->execute ( $request);
  279. $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
  280. $resultCode = $result->$responseNode->code;
  281. if(!empty($resultCode)&&$resultCode == 10000){
  282. echo "成功";
  283. } else {
  284. echo "失败";
  285. }
  286. // vendor('alipayAop.AopSdk');
  287. // $aop = new \AopClient();
  288. // $aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
  289. // $aop->appId = '2021002156644399';
  290. // $aop->rsaPrivateKey = file_get_contents(Config::get('alipayAop')['private_key']);
  291. // $aop->alipayrsaPublicKey = file_get_contents(Config::get('alipayAop')['alipay_public_key']);
  292. // $aop->apiVersion = '1.0';
  293. // $aop->signType = 'RSA2';
  294. // $aop->postCharset='UTF-8';
  295. // $aop->format='json';
  296. //
  297. // $object = new \stdClass();
  298. // $object->out_trade_no = makeOrderid();
  299. // $object->total_amount = 0.01;
  300. // $object->subject = '测试商品';
  301. // $object->scene ='bar_code';
  302. // $object->auth_code = '2088141882030979';
  303. // $json = json_encode($object);
  304. // $request = new \AlipayTradePayRequest();
  305. // $request->setBizContent($json);
  306. // $result = $aop->execute($request);
  307. // print_r($result);die;
  308. // $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
  309. //
  310. // $resultCode = $result->$responseNode->code;
  311. //
  312. // if(!empty($resultCode)&&$resultCode == 10000){
  313. // echo "成功";
  314. // } else {
  315. // echo "失败";
  316. // }
  317. }
  318. public function index()
  319. {
  320. $orderid = makeOrderid();
  321. $productname = "产品名称";
  322. $real_amount = 0.01;
  323. $payData['orderid'] = $orderid;
  324. $payData['real_amount'] =$real_amount;
  325. $payData['productname'] = $productname;
  326. $payData['productdesc'] = "";
  327. $payData['status'] = 0;
  328. $payData['create_time'] = NOW_TIMESTAMP;
  329. Db::name("cy_demo")->insert($payData);
  330. //第三方支付用的商品简单描述 (去除&+等特殊字符)
  331. $payBody = preg_replace("/[\&\+]+/", '', $productname);
  332. //支付宝支付参数
  333. $qrcodePay = $this->chargeByZfbWap($orderid, 0.01, $payBody) ;
  334. // $qrcodePay = htmlspecialchars($qrcodePay);
  335. $result1['mweb_url'] = $qrcodePay;
  336. $result['zfbsmzf_param'] = $result1;
  337. $result['orderid'] = $orderid;
  338. $result['referer'] = "com.yiyou.smzfb";
  339. $this->jsonResult($result, 1, '订单生成成功',false);
  340. }
  341. public function jsonResult($data, $code = 0, $msg = '',$isExit=true)
  342. {
  343. $result = [
  344. 'code' => $code,
  345. 'msg' => $msg,
  346. 'time' => request()->server('REQUEST_TIME'),
  347. 'data' => $data,
  348. ];
  349. print_r($result);die;
  350. }
  351. private function chargeByZfbWap($orderid, $real_amount, $productname, $productdesc = '')
  352. {
  353. vendor('alipayAop.AopSdk');
  354. $aop = new \AopClient();
  355. $aop->gatewayUrl = "https://openapi.alipay.com/gateway.do"; //网关地址要使用沙箱网关alipaydev
  356. $aop->appId = "2021002156644399";
  357. $aop->rsaPrivateKey = file_get_contents(Config::get('alipayAop')['private_key']);
  358. $aop->alipayrsaPublicKey = file_get_contents(Config::get('alipayAop')['alipay_public_key']);
  359. $aop->format = "json";
  360. $aop->apiVersion = '1.0';
  361. $aop->postCharset = 'UTF-8';
  362. $aop->signType = "RSA2";
  363. //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
  364. $request = new \AlipayTradePagePayRequest();
  365. $productname = preg_replace("/[\&\+]+/", '', $productname); // 主题(过滤特殊字符)
  366. $subject = preg_replace("/[\&\+]+/", '', $productdesc); // 商品描述信息(过滤特殊字符)
  367. //SDK已经封装掉了公共参数,这里只需要传入业务参数
  368. $info = json_encode(['body' => $subject, 'subject' => $productname, 'out_trade_no' => $orderid,
  369. 'timeout_express' => '30m', 'total_amount' => $real_amount, 'product_code' => 'FAST_INSTANT_TRADE_PAY'], JSON_UNESCAPED_UNICODE);
  370. $request->setBizContent($info);
  371. // $request->setReturnUrl("http://" . $_SERVER['HTTP_HOST'] . "/v1.user_center/returnUrl.html");
  372. // $request->setNotifyUrl("http://" . $_SERVER['HTTP_HOST'] . "/v1.platform_pay/notify.html");
  373. $request->setNotifyUrl(Config::get('alipayAop')['notify_url']);
  374. $result = $aop->pageExecute($request);
  375. // $result = htmlspecialchars($result);
  376. return $result;
  377. }
  378. private function getAlipayWapPostAopParam($orderid,$real_amount,$productname,$productdesc='')
  379. {
  380. vendor('alipayAop.AopSdk');
  381. $aop = new \AopClient();
  382. $aop->gatewayUrl = "https://openapi.alipay.com/gateway.do"; //网关地址要使用沙箱网关alipaydev
  383. $aop->appId = "2021002156644399";
  384. $aop->rsaPrivateKey = file_get_contents(Config::get('alipayAop')['private_key']);
  385. $aop->alipayrsaPublicKey = file_get_contents(Config::get('alipayAop')['alipay_public_key']);
  386. $aop->format = "json";
  387. $aop->apiVersion = '1.0';
  388. $aop->postCharset='UTF-8';
  389. $aop->signType = "RSA2";
  390. //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
  391. $request = new \AlipayTradePagePayRequest();
  392. //SDK已经封装掉了公共参数,这里只需要传入业务参数
  393. $info = json_encode(['body'=>$productdesc,'subject'=>$productname,'out_trade_no'=>$orderid,
  394. 'timeout_express'=>'30m','total_amount'=>$real_amount,'product_code'=>'FAST_INSTANT_TRADE_PAY'],JSON_UNESCAPED_UNICODE);
  395. $request->setBizContent($info);
  396. $request->setReturnUrl("http://" . $_SERVER['HTTP_HOST'] . "/v1.demo/returnback.html");
  397. $request->setNotifyUrl("http://" . $_SERVER['HTTP_HOST'] . "/v1.demo/alipayAop.html");
  398. $result = $aop->pageExecute($request);
  399. $result = htmlspecialchars($result);
  400. return $result;
  401. //Alipay Aop Sdk支付发起
  402. // vendor('alipayAop.AopSdk');
  403. // $aop = new \AopClient();
  404. //
  405. // $aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
  406. // $aop->appId = Config::get('alipayAop')['appId'];
  407. // $aop->rsaPrivateKey = file_get_contents(Config::get('alipayAop')['private_key']);
  408. // $aop->alipayrsaPublicKey = file_get_contents(Config::get('alipayAop')['alipay_public_key']);
  409. // $aop->apiVersion = '1.0';
  410. // $aop->signType = Config::get('alipayAop')['sign_type'];
  411. // $aop->postCharset = 'utf-8';
  412. // $aop->format = 'json';
  413. //
  414. // $request = new \AlipayTradeWapPayRequest();
  415. // $bizcontent = array();
  416. // $bizcontent['subject'] = preg_replace("/[\&\+]+/", '', $productname); // 主题(过滤特殊字符)
  417. // $bizcontent['body'] = preg_replace("/[\&\+]+/", '', $productdesc); // 商品描述信息(过滤特殊字符)
  418. // $bizcontent['out_trade_no'] = $orderid; // 订单号
  419. // $bizcontent['timeout_express'] = '30m'; // 超时时间
  420. // $bizcontent['total_amount'] = $real_amount; // 支付金额
  421. // $bizcontent['product_code'] = 'QUICK_MSECURITY_PAY'; // 支付方式
  422. //
  423. // $request->setBizContent(json_encode($bizcontent));
  424. // $request->setNotifyUrl("http://" . $_SERVER['HTTP_HOST'] . "/v1.demo/alipayAop.html");
  425. // $result = $aop->pageExecute($request);
  426. // return $result;
  427. }
  428. /**
  429. * 生成订单号,每秒可产生9999个不重复的订单号
  430. * @return string
  431. */
  432. function makeOrderid(){
  433. $redis = think\Cache::store('default');
  434. $orderid = (microtime(true)*10000).substr(str_pad(mt_rand(), 6, "0", STR_PAD_BOTH), 0, 6);
  435. // 判断是否有同个订单号的请求还没处理完,防止因为网络问题,导致同个订单并发
  436. $cache_key = 'orderid:'.$orderid;
  437. if($redis->has($cache_key)) {
  438. return makeOrderid();
  439. }else{
  440. $redis->set($cache_key, $orderid, 86400);
  441. return 'ZFB'.$orderid;
  442. }
  443. }
  444. public function alipays() {
  445. vendor('alipay.lib.AlipayNotify');
  446. $alipayNotify = new \AlipayNotify(Config::get('alipay'));
  447. if ($result = $alipayNotify->verifyNotify()) {
  448. // 处理支付成功后的逻辑业务
  449. if (input('post.trade_status') == 'TRADE_SUCCESS') {
  450. //写入日志
  451. log_message($result,'log',LOG_PATH . '../paylog/');
  452. $out_trade_no = input('out_trade_no'); //订单号
  453. if(!empty($out_trade_no)){
  454. //更新订单状态处理
  455. $this->updateOrder($out_trade_no,input('total_fee'));
  456. }
  457. echo 'success';exit; //请不要修改或删除
  458. }
  459. echo 'fail';exit; //验证失败
  460. }
  461. echo 'fail';exit;
  462. }
  463. private function updateOrders($orderid,$real_amount='')
  464. {
  465. $payModel = new Pay;
  466. $payCpinfoModel = new PayCpinfo;
  467. $membersModel = new Members;
  468. $result = false;
  469. //消费订单信息
  470. $payInfo = $payModel->field('id,status,amount,real_amount,userid,gameid,channel_id')->where(['orderid'=>$orderid])->find();
  471. if($real_amount!='' && $payInfo['real_amount']!=$real_amount)
  472. {
  473. $result = false;
  474. //写入日志
  475. log_message('订单编号:'.$orderid.'支付金额不一致,订单状态更新失败','error',LOG_PATH . '../paylog/');
  476. }
  477. //待支付状态时
  478. elseif($payInfo['status']==0){
  479. // 启动事务
  480. Db::startTrans();
  481. try{
  482. $payModel->where(['id'=>$payInfo['id']])->update(['status'=>1,'pay_time'=>NOW_TIMESTAMP]);
  483. //cy_paycpinfo表记录状态更新
  484. $payCpinfoModel->where(['orderid'=>$orderid])->update(['payflag'=>1]);
  485. $result = true;
  486. // 提交事务
  487. Db::commit();
  488. } catch (\Exception $e) {
  489. // 回滚事务
  490. Db::rollback();
  491. $result = false;
  492. //写入日志
  493. log_message('订单编号:'.$orderid.'订单状态更新失败'.$e->getMessage(),'error',LOG_PATH . '../paylog/');
  494. }
  495. }
  496. //订单状态更新成功
  497. if($result){
  498. //更新member表的total_pay_amount
  499. $membersModel->where(['id'=>$payInfo['userid']])->update(['total_pay_amount'=>Db::raw('total_pay_amount+'.$payInfo['amount'])]);
  500. // 通知CP,支付成功
  501. (new PayCallback())->callBackToCp($orderid);
  502. //预警邮件
  503. (new PayLogic())->payWarning($payInfo['userid'], $payInfo['channel_id'], $payInfo['gameid'], $payInfo['amount']);
  504. }
  505. }
  506. /**
  507. * 支付宝Aop支付服务器异步通知页面方法
  508. */
  509. public function alipayAop() {
  510. //Alipay Aop Sdk支付回调
  511. vendor('alipayAop.AopSdk');
  512. $aop = new \AopClient();
  513. $aop->alipayrsaPublicKey = file_get_contents(Config::get('alipayAop')['alipay_public_key']);
  514. if ($result = $aop->rsaCheckV1($_POST, NULL, "RSA2")) {
  515. // 处理支付成功后的逻辑业务
  516. if (input('post.trade_status') == 'TRADE_SUCCESS') {
  517. $out_trade_no = input('out_trade_no'); //订单号
  518. $payData1['productname'] = "订单";
  519. $payData1['productdesc'] = $out_trade_no;
  520. Db::name("cy_demo")->insert($payData1);
  521. if(!empty($out_trade_no)){
  522. //更新订单状态处理
  523. $this->updateOrder($out_trade_no,input('total_fee'));
  524. }
  525. echo 'success';exit; //请不要修改或删除
  526. }
  527. echo 'fail';exit; //验证失败
  528. }
  529. echo 'fail';exit;
  530. }
  531. private function updateOrder($orderid)
  532. {
  533. Db::name("cy_demo")->where(['orderid'=>$orderid])->update(['status'=>1]);
  534. }
  535. // public function notify()
  536. // {
  537. // try{
  538. // $info = $_POST;
  539. // vendor('alipayAop.AopSdk');
  540. // $aop = new \AopClient();
  541. // $aop->alipayrsaPublicKey = file_get_contents(Config::get('alipayAop')['alipay_public_key']);
  542. // $flag = $aop->rsaCheckV1($info,NULL,"RSA2"); //验签
  543. // if(!$flag)
  544. // {
  545. // echo 'fail';exit;
  546. // }
  547. // else if($info['trade_status']=='TRADE_SUCCESS') //支付状态
  548. // {
  549. // $this->updateOrder($info['out_trade_no'],$info['total_fee']);
  550. // }
  551. // }catch (Exception $e)
  552. // {
  553. //
  554. // }
  555. //
  556. // }
  557. public function returnback()
  558. {
  559. echo "<h1>支付成功<h1>";
  560. halt($_GET);
  561. }
  562. public function wxpay()
  563. {
  564. $user_ip = "";
  565. if(isset($_SERVER['HTTP_CLIENT_IP']))
  566. {
  567. $user_ip = $_SERVER['HTTP_CLIENT_IP'];
  568. }
  569. else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
  570. {
  571. $user_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  572. }else
  573. {
  574. $user_ip = $_SERVER['REMOTE_ADDR'];
  575. }
  576. $orderid = makeOrderid();
  577. $real_amount = 0.01;
  578. $productname = "产品";
  579. $productdesc = "产品";
  580. $wxsmParam = $this->getWxWapsmPostAopParam($orderid,$real_amount,$productname,$productdesc,$user_ip);
  581. $result = ['wxpaysm_param'=>$wxsmParam];
  582. $this->jsonResult($result, 1, '订单生成成功',false);
  583. //print_r($result);die;
  584. }
  585. private function getWxWapsmPostAopParam($orderid,$real_amount,$productname,$productdesc='',$user_ip='127.0.0.1')
  586. {
  587. //获取用户IP
  588. $user_ip = $user_ip;
  589. $version = "1";
  590. $agent_id = Config::get('wxwappay-h5')['mch_id'];//商户编号,(汇付宝商户内码:七位整数数字)
  591. $sign_key = Config::get('wxwappay-h5')['key'];
  592. $notify_url = Config::get('wxwappay-h5')['notify_url'];//支付后返回的商户处理页面,URL参数是以http://或https://开头的完整URL地址(后台处理),提交的url地址必须外网能访问到,否则无法通知商户。值可以为空,但不可以为null。
  593. $scene = "qr";//支付方式,h5表示h5,qr表示扫码(如支付类型为扫码,payment_mode传UnifiedOrder返回二维码url),jsapi表示公众号(微信内拉起),app表示app拉起支付(值均为小写)
  594. $pay_type = "30";//支付类型30
  595. $agent_bill_id = $orderid;//商户系统内部的订单号(要保证唯一)
  596. $agent_bill_time = date('YmdHis', time());//提交单据的时间yyyyMMddHHmmss,该参数共计14位,当时不满14位时,在后面加0补足14位
  597. $pay_amt = 0.01;//订单总金额 不可为空。小数点后保留两位
  598. $return_url = Config::get('wxwappay-h5')['return_url']."?URLscheme=yiyouweixin";//支付后返回的商户显示页面,URL参数是以http://或https://开头的完整URL地址(前台显示),原则上该参数与notify_url提交的参数不一致。值可以为空,但不可以为null。
  599. $user_ip = str_replace(".","_",$user_ip);//用户所在客户端的真实ip其中的“.”替换为“_” 。因为近期我方发现用户在提交数据时,user_ip在网络层被篡改,导致签名错误,所以我们规定使用这种格式。
  600. $goods_name = "产品";//商品名称,不能为空(不参加签名)
  601. $goods_name=iconv("UTF-8", "gbk", $goods_name);
  602. $remark = "";//商户自定义,原样返回,可以为空。
  603. $goods_note = "";
  604. $payment_mode = "cashier";//收银台=cashier,接口=UnifiedOrder(目前支持扫码,app)
  605. $n = "南京麻花网络";
  606. $fileName=iconv("UTF-8", "gbk", $n);
  607. $strs='{"s":"WAP","n":"'.$fileName.'","id":"http://46yx.com"}';
  608. $str = base64_encode($strs);
  609. $meta_option =urlencode($str);//加密后的结果
  610. $bank_card_type = "-1";//银行类型:未知=-1,储蓄卡=0,信用卡=1。
  611. $timestamp = "";//时间戳,传了订单有效时间上下1min,从1970年1月1日0时到现在的毫秒数,传了参与签名,签名位置在key前面。
  612. $sign_type = "MD5";//签名类型,MD5\RSA\RSA2
  613. $data['version']=$version;
  614. $data['scene']=$scene;
  615. $data['payment_mode']=$payment_mode;
  616. $data['agent_id']=$agent_id;
  617. $data['agent_bill_id']=$agent_bill_id;
  618. $data['agent_bill_time']=$agent_bill_time;
  619. $data['pay_type']=$pay_type;
  620. $data['pay_amt']=$pay_amt;
  621. $data['notify_url']=$notify_url;
  622. $data['return_url']=$return_url;
  623. $data['user_ip']=$user_ip;
  624. $data['goods_name']=$goods_name;
  625. $data['goods_note']=$goods_note;
  626. $data['remark']=$remark;
  627. $data['meta_option']=$meta_option;
  628. $data['bank_card_type']=$bank_card_type;
  629. $sign_str = '';
  630. $sign_str = $sign_str.'version='.$version;
  631. $sign_str = $sign_str.'&agent_id='.$agent_id;
  632. $sign_str = $sign_str.'&agent_bill_id='.$agent_bill_id;
  633. $sign_str = $sign_str.'&agent_bill_time='.$agent_bill_time;
  634. $sign_str = $sign_str.'&pay_type='.$pay_type;
  635. $sign_str = $sign_str.'&pay_amt='.$pay_amt;
  636. $sign_str = $sign_str.'&notify_url='.$notify_url;
  637. $sign_str = $sign_str.'&return_url='.$return_url;
  638. $sign_str = $sign_str.'&user_ip='.$user_ip;
  639. $sign_str = $sign_str.'&bank_card_type='.$bank_card_type;
  640. $sign_str = $sign_str.'&remark='.urlencode($remark);
  641. $sign_str = $sign_str.'&key='.$sign_key;
  642. $sign = md5($sign_str); ////MD5\RSA\RSA2签名结果
  643. $data['sign']=$sign;
  644. $urls = Config::get('wxwappay-h5')['pay_url'];
  645. $response = $this->postXmlCurl($data,$urls);
  646. $redirectUrl = "";
  647. if(!empty($response))
  648. {
  649. if($response['ret_code'] == '0000')
  650. {
  651. $redirectUrl = $response['redirectUrl'];
  652. $ret_code = $response['ret_code'];
  653. $ret_msg = $response['ret_msg'];
  654. $hf_sign = md5('redirectUrl='.$redirectUrl.'&ret_code='.$ret_code.'&ret_msg='.$ret_msg.'&key='.$sign_key);
  655. if($hf_sign != $response['sign'])
  656. {
  657. $this->jsonResult('', 0, '订单生成失败',false);
  658. }
  659. }else{
  660. $this->jsonResult('', 0, '订单生成失败',false);
  661. }
  662. }else{
  663. $this->jsonResult('', 0, '订单生成失败',false);
  664. }
  665. $pay_return['mweb_url'] = $redirectUrl;
  666. $pay_return['referer'] = Config::get('wxpay-h5')['referer'];
  667. return $pay_return;
  668. }
  669. // public function wx()
  670. // {
  671. //
  672. // //获取用户IP
  673. // $user_ip = "";
  674. // if(isset($_SERVER['HTTP_CLIENT_IP']))
  675. // {
  676. // $user_ip = $_SERVER['HTTP_CLIENT_IP'];
  677. // }
  678. // else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
  679. // {
  680. // $user_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  681. // }else
  682. // {
  683. // $user_ip = $_SERVER['REMOTE_ADDR'];
  684. // }
  685. //
  686. // $version = "1";
  687. // $agent_id = Config::get('wxwappay-h5')['mch_id'];//商户编号,(汇付宝商户内码:七位整数数字)
  688. // $sign_key = Config::get('wxwappay-h5')['key'];
  689. //// $agent_id = "2083328";//商户编号,(汇付宝商户内码:七位整数数字)
  690. //// $sign_key = "852B4A10455E49F280EEFCB1";
  691. // $notify_url = "http://" . $_SERVER['HTTP_HOST'] . "/v1.demo/wxnotify.html";//支付后返回的商户处理页面,URL参数是以http://或https://开头的完整URL地址(后台处理),提交的url地址必须外网能访问到,否则无法通知商户。值可以为空,但不可以为null。
  692. // $scene = "qr";//支付方式,h5表示h5,qr表示扫码(如支付类型为扫码,payment_mode传UnifiedOrder返回二维码url),jsapi表示公众号(微信内拉起),app表示app拉起支付(值均为小写)
  693. // $pay_type = "30";//支付类型30
  694. // $agent_bill_id = makeOrderid();//商户系统内部的订单号(要保证唯一)
  695. // $agent_bill_time = date('YmdHis', time());//提交单据的时间yyyyMMddHHmmss,该参数共计14位,当时不满14位时,在后面加0补足14位
  696. // $pay_amt = 0.01;//订单总金额 不可为空。小数点后保留两位
  697. // $return_url = "http://" . $_SERVER['HTTP_HOST'] . "/v1.demo/wxreturn.html";//支付后返回的商户显示页面,URL参数是以http://或https://开头的完整URL地址(前台显示),原则上该参数与notify_url提交的参数不一致。值可以为空,但不可以为null。
  698. // $user_ip = str_replace(".","_",$user_ip);//用户所在客户端的真实ip其中的“.”替换为“_” 。因为近期我方发现用户在提交数据时,user_ip在网络层被篡改,导致签名错误,所以我们规定使用这种格式。
  699. // $goods_name = "产品名称";//商品名称,不能为空(不参加签名)
  700. // $goods_name=iconv("UTF-8", "gbk", $goods_name);
  701. // $remark = "";//商户自定义,原样返回,可以为空。
  702. // $goods_note = "";
  703. // $payment_mode = "cashier";//收银台=cashier,接口=UnifiedOrder(目前支持扫码,app)
  704. //
  705. // $n = "南京麻花网络";
  706. // $fileName=iconv("UTF-8", "gbk", $n);
  707. // $strs='{"s":"WAP","n":"'.$fileName.'","id":"http://46yx.com"}';
  708. // $str = base64_encode($strs);
  709. // $meta_option =urlencode($str);//加密后的结果
  710. //
  711. // $bank_card_type = "-1";//银行类型:未知=-1,储蓄卡=0,信用卡=1。
  712. // $timestamp = "";//时间戳,传了订单有效时间上下1min,从1970年1月1日0时到现在的毫秒数,传了参与签名,签名位置在key前面。
  713. // $sign_type = "MD5";//签名类型,MD5\RSA\RSA2
  714. //
  715. // $sign_str = '';
  716. // $sign_str = $sign_str.'version='.$version;
  717. // $sign_str = $sign_str.'&agent_id='.$agent_id;
  718. // $sign_str = $sign_str.'&agent_bill_id='.$agent_bill_id;
  719. // $sign_str = $sign_str.'&agent_bill_time='.$agent_bill_time;
  720. // $sign_str = $sign_str.'&pay_type='.$pay_type;
  721. // $sign_str = $sign_str.'&pay_amt='.$pay_amt;
  722. // $sign_str = $sign_str.'&notify_url='.$notify_url;
  723. // $sign_str = $sign_str.'&return_url='.$return_url;
  724. // $sign_str = $sign_str.'&user_ip='.$user_ip;
  725. // $sign_str = $sign_str.'&bank_card_type='.$bank_card_type;
  726. // $sign_str = $sign_str.'&remark='.urlencode($remark);
  727. // $sign_str = $sign_str.'&key='.$sign_key;
  728. // $sign = md5($sign_str); ////MD5\RSA\RSA2签名结果
  729. //
  730. //// $sign = md5('version='.$version.'&agent_id='.$agent_id.'&agent_bill_id='.$agent_bill_id.'&agent_bill_time='.$agent_bill_time.'&pay_type='.$pay_type.'&pay_amt='.$pay_amt.'&notify_url='.$notify_url.'&return_url='.$return_url.'&user_ip='.$user_ip.'&bank_card_type='.$bank_card_type.'&remark='.$remark.'&key='.$sign_key);
  731. //
  732. // $url = "https://Pay.Heepay.com/DirectPay/applypay.aspx?version=$version&scene=$scene&payment_mode=$payment_mode&agent_id=$agent_id&agent_bill_id=$agent_bill_id&agent_bill_time=$agent_bill_time&pay_type=$pay_type&pay_amt=$pay_amt&notify_url=$notify_url&return_url=$return_url&user_ip=$user_ip&goods_name=$goods_name&goods_note=$goods_note&remark=$remark&meta_option=$meta_option&bank_card_type=$bank_card_type&sign=$sign";
  733. //
  734. // $data['version']=$version;
  735. // $data['scene']=$scene;
  736. // $data['payment_mode']=$payment_mode;
  737. // $data['agent_id']=$agent_id;
  738. // $data['agent_bill_id']=$agent_bill_id;
  739. // $data['agent_bill_time']=$agent_bill_time;
  740. // $data['pay_type']=$pay_type;
  741. // $data['pay_amt']=$pay_amt;
  742. // $data['notify_url']=$notify_url;
  743. // $data['return_url']=$return_url;
  744. // $data['user_ip']=$user_ip;
  745. // $data['goods_name']=$goods_name;
  746. // $data['goods_note']=$goods_note;
  747. // $data['remark']=$remark;
  748. // $data['meta_option']=$meta_option;
  749. // $data['bank_card_type']=$bank_card_type;
  750. // $data['sign']=$sign;
  751. // $urls = Config::get('wxwappay-h5')['pay_url'];;
  752. //
  753. // $response = $this->postXmlCurl($data,$urls);
  754. //
  755. //
  756. // $redirectUrl = "";
  757. // if(!empty($response))
  758. // {
  759. // if($response['ret_code'] == '0000')
  760. // {
  761. // $redirectUrl = $response['redirectUrl'];
  762. // $ret_code = $response['ret_code'];
  763. // $ret_msg = $response['ret_msg'];
  764. // $hf_sign = md5('redirectUrl='.$redirectUrl.'&ret_code='.$ret_code.'&ret_msg='.$ret_msg.'&key='.$sign_key);
  765. // if($hf_sign != $response['sign'])
  766. // {
  767. // $this->jsonResult('', 0, '订单生成失败',false);
  768. // }
  769. // }else{
  770. // $this->jsonResult('', 0, '订单生成失败',false);
  771. // }
  772. // }else{
  773. // $this->jsonResult('', 0, '订单生成失败',false);
  774. // }
  775. // $pay_return['mweb_url'] = $redirectUrl;
  776. // $pay_return['referer'] = Config::get('wxpay-h5')['referer'];
  777. // return $pay_return;
  778. //
  779. // }
  780. /**
  781. * 将xml转为array
  782. * @param string $xml
  783. *
  784. * @return array
  785. */
  786. public function xmlToArray($xml)
  787. {
  788. if (!$xml) {
  789. return false;
  790. }
  791. $data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
  792. return $data;
  793. }
  794. /**
  795. * 作用:以post方式提交xml到对应的接口url
  796. *
  797. * @param $xml string xml的报文内容
  798. * @param $second int 请求的超时时间
  799. *
  800. */
  801. public function postXmlCurl($post_data,$url='',$second=30){
  802. if($url==''){
  803. $url = $this->url;
  804. }
  805. $ch = curl_init();
  806. curl_setopt($ch, CURLOPT_URL, $url);
  807. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  808. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
  809. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  810. // post数据
  811. curl_setopt($ch, CURLOPT_POST, 1);
  812. // post的变量
  813. curl_setopt($ch, CURLOPT_POSTFIELDS,$post_data);
  814. //执行请求
  815. $output = curl_exec($ch);
  816. //打印获得的数据
  817. $xml = $this->xmlToArray($output);
  818. return $xml;
  819. curl_close($ch);
  820. }
  821. public function wxnotify()
  822. {
  823. echo "请求成功";
  824. }
  825. public function wxreturn()
  826. {
  827. echo "请求成功";
  828. }
  829. public function wxwebpay()
  830. {
  831. //获取用户IP
  832. $user_ip = "";
  833. if(isset($_SERVER['HTTP_CLIENT_IP']))
  834. {
  835. $user_ip = $_SERVER['HTTP_CLIENT_IP'];
  836. }
  837. else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
  838. {
  839. $user_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  840. }else
  841. {
  842. $user_ip = $_SERVER['REMOTE_ADDR'];
  843. }
  844. $version = "1";
  845. $agent_id = Config::get('wxwappay-h5')['mch_id'];//商户编号,(汇付宝商户内码:七位整数数字)
  846. $sign_key = Config::get('wxwappay-h5')['key'];
  847. // $agent_id = "2083328";//商户编号,(汇付宝商户内码:七位整数数字)
  848. // $sign_key = "852B4A10455E49F280EEFCB1";
  849. $notify_url = "http://" . $_SERVER['HTTP_HOST'] . "/v1.demo/wxnotify.html";//支付后返回的商户处理页面,URL参数是以http://或https://开头的完整URL地址(后台处理),提交的url地址必须外网能访问到,否则无法通知商户。值可以为空,但不可以为null。
  850. $scene = "qr";//支付方式,h5表示h5,qr表示扫码(如支付类型为扫码,payment_mode传UnifiedOrder返回二维码url),jsapi表示公众号(微信内拉起),app表示app拉起支付(值均为小写)
  851. $pay_type = "30";//支付类型30
  852. $agent_bill_id = makeOrderid();//商户系统内部的订单号(要保证唯一)
  853. $agent_bill_time = date('YmdHis', time());//提交单据的时间yyyyMMddHHmmss,该参数共计14位,当时不满14位时,在后面加0补足14位
  854. $pay_amt = 0.01;//订单总金额 不可为空。小数点后保留两位
  855. $return_url = "http://" . $_SERVER['HTTP_HOST'] . "/v1.demo/wxreturn.html";//支付后返回的商户显示页面,URL参数是以http://或https://开头的完整URL地址(前台显示),原则上该参数与notify_url提交的参数不一致。值可以为空,但不可以为null。
  856. $user_ip = str_replace(".","_",$user_ip);//用户所在客户端的真实ip其中的“.”替换为“_” 。因为近期我方发现用户在提交数据时,user_ip在网络层被篡改,导致签名错误,所以我们规定使用这种格式。
  857. $goods_name = "产品名称";//商品名称,不能为空(不参加签名)
  858. $remark = "";//商户自定义,原样返回,可以为空。
  859. $goods_note = "";
  860. $payment_mode = "cashier";//收银台=cashier,接口=UnifiedOrder(目前支持扫码,app)
  861. $n = "南京麻花网络";
  862. $fileName=iconv("UTF-8", "gbk", $n);
  863. $strs='{"s":"WAP","n":"'.$fileName.'","id":"http://46yx.com"}';
  864. $str = base64_encode($strs);
  865. $meta_option =urlencode($str);//加密后的结果
  866. $bank_card_type = "-1";//银行类型:未知=-1,储蓄卡=0,信用卡=1。
  867. $timestamp = "";//时间戳,传了订单有效时间上下1min,从1970年1月1日0时到现在的毫秒数,传了参与签名,签名位置在key前面。
  868. $sign_type = "MD5";//签名类型,MD5\RSA\RSA2
  869. $sign_str = '';
  870. $sign_str = $sign_str.'version='.$version;
  871. $sign_str = $sign_str.'&agent_id='.$agent_id;
  872. $sign_str = $sign_str.'&agent_bill_id='.$agent_bill_id;
  873. $sign_str = $sign_str.'&agent_bill_time='.$agent_bill_time;
  874. $sign_str = $sign_str.'&pay_type='.$pay_type;
  875. $sign_str = $sign_str.'&pay_amt='.$pay_amt;
  876. $sign_str = $sign_str.'&notify_url='.$notify_url;
  877. $sign_str = $sign_str.'&return_url='.$return_url;
  878. $sign_str = $sign_str.'&user_ip='.$user_ip;
  879. $sign_str = $sign_str.'&key='.$sign_key;
  880. $sign = md5($sign_str); ////MD5\RSA\RSA2签名结果
  881. // $sign = md5('version='.$version.'&agent_id='.$agent_id.'&agent_bill_id='.$agent_bill_id.'&agent_bill_time='.$agent_bill_time.'&pay_type='.$pay_type.'&pay_amt='.$pay_amt.'&notify_url='.$notify_url.'&return_url='.$return_url.'&user_ip='.$user_ip.'&bank_card_type='.$bank_card_type.'&remark='.$remark.'&key='.$sign_key);
  882. $url = "https://Pay.Heepay.com/DirectPay/applypay.aspx?version=$version&agent_id=$agent_id&agent_bill_id=$agent_bill_id&agent_bill_time=$agent_bill_time&pay_type=$pay_type&pay_amt=$pay_amt&notify_url=$notify_url&return_url=$return_url&user_ip=$user_ip&goods_name=$goods_name&goods_num=1&goods_note=$goods_note&remark=$remark&sign=$sign";
  883. $data['version']=$version;
  884. $data['agent_id']=$agent_id;
  885. $data['agent_bill_id']=$agent_bill_id;
  886. $data['agent_bill_time']=$agent_bill_time;
  887. $data['pay_type']=$pay_type;
  888. $data['pay_amt']=$pay_amt;
  889. $data['notify_url']=$notify_url;
  890. $data['return_url']=$return_url;
  891. $data['user_ip']=$user_ip;
  892. $data['goods_name']=$goods_name;
  893. $data['goods_num']=1;
  894. $data['goods_note']=$goods_note;
  895. $data['remark']=$remark;
  896. $data['sign']=$sign;
  897. $urls = "https://pay.heepay.com/Payment/Index.aspx?";
  898. $response = $this->postXmlCurl($data,$urls);
  899. print_r($response);die;
  900. }
  901. }