alert('网络传输中掉包,请重新支付!')"; // exit; //} //定义数据 $email='900024'; $userid='851811130002'; $userkey='8a9bd64e6585c6d8016585c6c8980002'; //1.获取数据 $orderid = 'nanodream'.date('YmdHis',time());//_G('orderid'); //订单号 $price = rand(1,5); //交易金额 $NotifyUrl = 'http://' . _S('HTTP_HOST') . '/pay/sbweixin_bank/notify_url.php'; //服务端返回地址 //$order_model = new orders_class(); //$addtime = $order_model->fetch_one('orderlist', "orderid='" . $orderid . "'", 'addtime'); //$addtime = $addtime['addtime']; //2.组装数据,用于生成签名 $reqestdata = array( 'inst_no' => $email, //机构号 'mch_no' => $userid,//商户号 'pay_trace_no' => $orderid,//请求流水号 'pay_time' => date('YmdHis',time()), 'total_amount' => $price * 100,//订单总金额 'notify_url' => $NotifyUrl, 'order_body' => "客服QQ3007549789订单号" . $orderid,//支付凭证商品描述信息,不填写默认为交易订单编号 'pay_type' => '400', ); //3.生成签名 $buidSign = makesign($reqestdata, $userkey); //4.组装数据,用于发起请求支付 $reqestdata['sign'] = $buidSign; //5.传递数据,请求数据 $url = "http://demo.payplat.cn/openpay/v3/prepay"; $respsonData = post_json($url, json_encode($reqestdata)); //发送请求 //6.获取数据 $respsonData = json_decode($respsonData, true); if ($respsonData['return_code'] != 'SUCCESS' || $respsonData['result_code'] != 'PAY_SUCCESS') { $error_message = "错误代码:" . $respsonData['result_code'] . " 错误描述:" . $respsonData['return_msg'] . " 错误信息" . $respsonData['return_code']; exit($error_message); } //7.赋值数据 $img = $respsonData['qrcode']; echo $img; /**生成签名 * @param $params /请求的参数数组 * @param $key /支付密钥 * @return string */ function makesign($paras, $key) { // $sort_array = $this->array_sort(array_filter($paras)); //删除数组中的空值并排序 $sort_array = array_sort($paras); $prestr = create_linkstring($sort_array); //把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串 $prestr = $prestr . "&key=" . $key; //把拼接后的字符串再与安全校验码直接连接起来 // \Think\Log::record('prestr:' . $prestr); $mysgin = sign($prestr, 'MD5'); //把最终的字符串签名,获得签名结果 return $mysgin; } /** * 对数组排序 * $array 排序前的数组 * return 排序后的数组 */ function array_sort($array) { ksort($array); //按照key值升序排列数组 return $array; } /** * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串 * $array 需要拼接的数组 * return 拼接完成以后的字符串 */ function create_linkstring($array) { $str = ""; foreach ($array as $key => $val) { ; //键值为空的参数不参与排序,键名为key的参数不参与排序 if ($key != "sign") { $str .= $key . "=" . $val . "&"; } } $str = trim($str, "&"); return $str; //返回参数 } /** * 签名字符串 * $prestr 需要签名的字符串 * $sign_type 签名类型,也就是sec_id * return 签名结果 */ function sign($prestr, $sign_type) { $sign = ''; if ($sign_type == 'MD5') { $sign = md5($prestr); //MD5加密 } elseif ($sign_type == 'DSA') { //DSA 签名方法待后续开发 die("DSA 签名方法待后续开发,请先使用MD5签名方式"); } elseif ($sign_type == "") { die("sign_type为空,请设置sign_type"); } else { die("暂不支持" . $sign_type . "类型的签名方式"); } return strtolower($sign); //返回参数并小写 } function requestAsHttpPOST($data, $service_url) { $HTTP_TIME_OUT = "20"; $http_data = $this->array_sort(array_filter($data)); //删除数组中的空值并排序 $post_data = http_build_query($http_data); $options = array( 'http' => array( 'method' => 'POST', 'header' => 'Content-type:application/x-www-form-urlencoded;charset=MD5', 'content' => $post_data, 'timeout' => $HTTP_TIME_OUT * 1000 //超时时间,*1000将毫秒变为秒(单位:s) ) ); $context = stream_context_create($options); $result = file_get_contents($service_url, false, $context); return $result; } // 提交post请求 function post_json($url, $post) { $ch = curl_init(); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']); $s = curl_exec($ch); curl_close($ch); return $s; } ?>