//微信支付生成预支付订单
public function weChat(){
$id=input('id');
$request=db("uniform_order")->where('id',$id)->find();
$nonce_str = $this->rand(32); // uuid 生成随机不重复字符串
$data['appid'] = "wx56ad8ccec5807919"; //appid
$data['mch_id'] = "1588554801"; //商户ID
$data['nonce_str'] = $nonce_str; //随机字符串 这个随便一个字符串算法就可以,我是使用的UUID
$data['out_trade_no'] = $request['ordersn']; //商户订单号,不能重复
$data['body'] = $request['season'];
$data['openid'] = $request['openid'];
$data['total_fee'] = $request['amount']*100; //金额
$data['spbill_create_ip'] = "122.114.169.27"; //ip地址
$data['notify_url'] = "https://xuexiao.aiwan520.cn/index/index/wx_notify"; //回调地址,用户接收支付后的通知,必须为能直接访问的网址,不能跟参数
$data['trade_type'] = 'JSAPI'; //支付方式
//将参与签名的数据保存到数组 注意:以上几个参数是追加到$data中的,$data中应该同时包含开发文档中要求必填的剔除sign以外的所有数据
$data['sign'] = $this->getSign($data); //获取签名
$xml = $this->ToXml($data); //数组转xml
//curl 传递给微信方
$url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
$data = $this->curl($url,$xml,[]); // 请求微信生成预支付订单
//返回结果
if($data){
//返回成功,将xml数据转换为数组.
$re = $this->FromXml($data);
if($re['return_code'] != 'SUCCESS'){
$msg = isset($re['return_msg'])?$re['return_msg']:'签名失败';
return ['status'=>false,'msg'=>$msg];
}
else{
//接收微信返回的数据,传给APP!
$arr =array(
'appId' => "wx56ad8ccec5807919",
'signType' =>'MD5',
'package' => 'prepay_id='.$re['prepay_id'],
'nonceStr' => $nonce_str,
'timeStamp' =>time(),
);
//第二次生成签名
$sign = $this->getSign($arr);
$arr['sign'] = $sign;
return json_encode(['status'=>true,'msg'=>'生成预支付订单成功','data'=>$arr]);
}
} else {
return ['status'=>false,'msg'=>'签名数据为空'];
}
}
//生成签名
public function getSign($params) {
ksort($params); //将参数数组按照参数名ASCII码从小到大排序
foreach ($params as $key => $item) {
if (!empty($item)) { //剔除参数值为空的参数
$newArr[] = $key.'='.$item; // 整合新的参数数组
}
}
$stringA = implode("&", $newArr); //使用 & 符号连接参数
$stringSignTemp = $stringA."&key="."1588554801woaixiaofu520520520520"; //拼接key
// key是在商户平台API安全里自己设置的
$stringSignTemp = MD5($stringSignTemp); //将字符串进行MD5加密
$sign = strtoupper($stringSignTemp); //将所有字符转换为大写
return $sign;
}
//数组转XML
public function ToXml($data=array())
{
if(!is_array($data) || count($data) <= 0)
{
return '数组异常';
}
$xml = "<xml>";
foreach ($data as $key=>$val)
{
if (is_numeric($val)){
$xml.="<".$key.">".$val."</".$key.">";
}else{
$xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
}
}
$xml.="</xml>";
return $xml;
}
//XML转数组
public function FromXml($xml)
{
if(!$xml){
echo "xml数据异常!";
}
//将XML转为array
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
$data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $data;
}