Paydsf.php 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. <?php
  2. namespace app\index\controller;
  3. use app\common\controller\Frontend;
  4. use think\Db;
  5. class Paydsf extends Frontend
  6. {
  7. protected $noNeedLogin = '*';
  8. protected $noNeedRight = '*';
  9. protected $layout = '';
  10. public function index()
  11. {
  12. $site=config('site');
  13. $out_trade_no=input('out_trade_no');
  14. if(!$out_trade_no){
  15. $this->error(__('找不到数据'));
  16. }
  17. $paylog=Db::name('paylog')->where('out_trade_no',$out_trade_no)->find();
  18. //dump($paylog);
  19. if(!$paylog){
  20. $this->error(__('找不到数据'));
  21. }
  22. // $number = date('ymdh', time()) . rand(10000, 99999);//订单编
  23. // Db::name('paylog')->where('out_trade_no',$out_trade_no)->update(['out_trade_no'=>$number]);
  24. $bankcode=!empty($paylog['tdnum'])?$paylog['tdnum']:$site['dsfzf']['bankcode'];//通道编码
  25. $pay_memberid = $site['dsfzf']['memberid']; //商户ID
  26. $pay_orderid = $paylog['out_trade_no']; //订单号
  27. $pay_amount =$paylog['amount']; //交易金额
  28. $pay_applydate = date("Y-m-d H:i:s"); //订单时间
  29. $pay_notifyurl = $site['dsfzf']['notifyurl']; //服务端返回地址
  30. $pay_callbackurl = $site['dsfzf']['callbackurl']; //页面跳转返回地址
  31. $Md5key = $site['dsfzf']['key']; //密钥
  32. $tjurl = $site['dsfzf']['tjurl']; //提交地址
  33. $pay_bankcode = $bankcode; //通道编码
  34. //扫码
  35. $native = array(
  36. "pay_memberid" => $pay_memberid,
  37. "pay_orderid" => $pay_orderid,
  38. "pay_amount" => $pay_amount,
  39. "pay_applydate" => $pay_applydate,
  40. "pay_bankcode" => $pay_bankcode,
  41. "pay_notifyurl" => $pay_notifyurl,
  42. "pay_callbackurl" => $pay_callbackurl,
  43. );
  44. ksort($native);
  45. $md5str = "";
  46. foreach ($native as $key => $val) {
  47. $md5str = $md5str . $key . "=" . $val . "&";
  48. }
  49. $sign = strtoupper(md5($md5str . "key=" . $Md5key));
  50. $native["pay_md5sign"] = $sign;
  51. $native['pay_attach'] = "1234|456";
  52. $native['pay_productname'] = '用户充值';
  53. $native['type'] = "json"; //json 或 html
  54. //die();
  55. $postData = http_build_query($native);
  56. $curl = curl_init();
  57. curl_setopt($curl, CURLOPT_URL, $tjurl);
  58. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // stop verifying certificate
  59. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  60. curl_setopt($curl, CURLOPT_POST, true);
  61. curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded;charset:utf-8;'));
  62. curl_setopt($curl, CURLOPT_POSTFIELDS, $postData);
  63. curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
  64. $data = curl_exec($curl);
  65. curl_close($curl);
  66. $json = json_decode($data,true);
  67. //var_dump($data);
  68. if($json['status'] =='1'){
  69. $url = $json['payUrl'];
  70. header("Location:$url");die;
  71. }else{
  72. exit($data);
  73. }
  74. }
  75. public function wxh5(){
  76. $site=config('site');
  77. $out_trade_no=input('out_trade_no');
  78. if(!$out_trade_no){
  79. $this->error(__('找不到数据'));
  80. }
  81. $paylog=Db::name('paylog')->where('out_trade_no',$out_trade_no)->find();
  82. //dump($paylog);
  83. if(!$paylog){
  84. $this->error(__('找不到数据'));
  85. }
  86. $key=$site['wxpay']['key'];
  87. $data=[
  88. 'appid'=>$site['weixinh5']['appid'],
  89. 'mch_id'=>$site['wxpay']['mch_id'],//账户号
  90. 'nonce_str'=>$this->getNonceStr(),//随机字符串,不长于32位
  91. //'sign'=>'',//签名
  92. 'body'=>'测试商品',//商品描述
  93. 'out_trade_no'=>$paylog['out_trade_no'],//商户订单号,不长于32位
  94. 'total_fee'=>$paylog['amount']*100,//总金额,以分为单位
  95. 'spbill_create_ip'=>$_SERVER['REMOTE_ADDR'],//用户端请求支付时的IP
  96. 'notify_url'=>$site['imgurl'].'/api/paywx/notifwxh5',//异步通知回调地址,必须是可直接访问地址,不能携带参数
  97. 'trade_type'=>'MWEB',
  98. ];
  99. $data['sign']=$this->genSign($data, $key);
  100. $params=$this->array_to_xml($data);
  101. $request=$this->postda($params);
  102. //$objectxml = simplexml_load_string($request);//将文件转换成 对象
  103. $objectxml = simplexml_load_string($request,"SimpleXMLElement", LIBXML_NOCDATA);
  104. $xmljson= json_encode($objectxml );//将对象转换个JSON
  105. $xmlarray=json_decode($xmljson,true);//将json转换成数组
  106. $mweb_url=isset($xmlarray['mweb_url'])?$xmlarray['mweb_url']:'';
  107. if($mweb_url){
  108. $redirect_url=$site['imgurl'].'/index/paydsf/zfcg?out_trade_no='.$paylog['out_trade_no'];
  109. $this->view->assign('mweb_url', $mweb_url.'&redirect_url='.$redirect_url);
  110. return $this->view->fetch();
  111. }else{
  112. $return_msg=isset($xmlarray['return_msg'])?$xmlarray['return_msg']:'';
  113. echo $return_msg;
  114. //$this->error($return_msg);
  115. }
  116. }
  117. /**
  118. *
  119. * 产生随机字符串,不长于32位
  120. * @param int $length
  121. * @return 产生的随机字符串
  122. */
  123. public function getNonceStr($length = 32)
  124. {
  125. $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
  126. $str ="";
  127. for ( $i = 0; $i < $length; $i++ ) {
  128. $str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);
  129. }
  130. return $str;
  131. }
  132. /**
  133. * 组建签名
  134. * @param array $params 请求参数
  135. * @param string $key 秘钥
  136. */
  137. public function genSign($params, $key)
  138. {
  139. foreach ($params as $k=>$v) {
  140. if (!$v) {
  141. unset($params[$k]);
  142. }
  143. }
  144. ksort($params);
  145. $paramStr = '';
  146. foreach ($params as $k => $v) {
  147. $paramStr = $paramStr . $k . '=' . $v . '&';
  148. }
  149. $paramStr = $paramStr . 'key='.$key;
  150. $sign = strtoupper(md5($paramStr));
  151. return $sign;
  152. }
  153. /**
  154. * 将数组转为XML
  155. * @param array $params 支付请求参数
  156. */
  157. public function array_to_xml($params)
  158. {
  159. if(!is_array($params)|| count($params) <= 0) {
  160. return false;
  161. }
  162. $xml = "<xml>";
  163. foreach ($params as $key=>$val) {
  164. if (is_numeric($val)) {
  165. $xml.="<".$key.">".$val."</".$key.">";
  166. } else {
  167. $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
  168. }
  169. }
  170. $xml.="</xml>";
  171. return $xml;
  172. }
  173. public function postda($params){
  174. $ch = curl_init();
  175. curl_setopt($ch, CURLOPT_URL, 'https://api.mch.weixin.qq.com/pay/unifiedorder');
  176. curl_setopt($ch, CURLOPT_HEADER, 0);
  177. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  178. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  179. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
  180. curl_setopt($ch, CURLOPT_POST, 1);
  181. curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
  182. $return = curl_exec($ch);
  183. curl_close($ch);
  184. return $return;
  185. }
  186. public function zfcg(){
  187. if ($this->request->isPost()) {
  188. $paylogs=Db::name('paylog')->where('id',input('id'))->find();
  189. $ispia=0;
  190. if($paylogs){
  191. echo json_encode($paylogs);
  192. die;
  193. }
  194. }
  195. $site=config('site');
  196. $out_trade_no=input('out_trade_no');
  197. if(!$out_trade_no){
  198. $this->error(__('找不到数据1'));
  199. }
  200. $paylog=Db::name('paylog')->where('out_trade_no',$out_trade_no)->find();
  201. //dump($paylog);
  202. if(!$paylog){
  203. $this->error(__('找不到数据2'));
  204. }
  205. $this->assign('paydata', $paylog);
  206. return $this->fetch();
  207. }
  208. }