微信APP支付 php服务端统一下单 tp5

/*==============================微信生成预支付订单===============================================*/

/*
* @param APP微信支付
* @param uid 用户id
* @param token 用户token
* @param oid 订单id
* @param title 标题描述
* @param attach 附加数据
* @parma money 金额
*/
    须要下载微信包 修改微信 WxPay.Config.Interface.php WxPay.Config.php 文件配置
    微信官网文档: https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1

public function wx_pay()
    {
$data = input("post.");
//获取订单数据,生成支付接口数据
$input = new \WxPayUnifiedOrder();
$input->SetBody($data['title']);     
$input->SetAttach($data['attach']);
$input->SetOut_trade_no($data['ordernum']);
$input->SetTotal_fee($data['money']*100);//$info['money']*100 微信金额以分为单位须要*100
$input->SetTime_start(date("YmdHis",time()));
$input->SetTime_expire(date("YmdHis",time()+600));
$input->SetSpbill_create_ip(get_client_ip());
$payReturn = 'http://tapi.zuozuobang.com/wx_notify';
$input->SetNotify_url($payReturn);
$input->SetTrade_type("APP");
$wx = new \WxPayConfigInterface();
$order = \WxPayApi::unifiedOrder($wx,$input);
if($order['return_msg']=="OK"){

          //微信包里面的,我用的是下面本身封装的
// $tools = new \JsApiPay();
// $jsApiParameters = $tools->GetJsApiParameters($order);
// $jsApiParameters = json_decode($jsApiParameters);
// return_msg('200',"微信支付调用成功",$jsApiParameters);


      //自封装的sing签名,二次生成签名,二次生成签名是如下几个参数和第一次提交信息生成的签名不一致
$result = array(
"appid" => $order['appid'],
"noncestr" => $this->rand_code(),
"package" => "Sign=WXPay",
"prepayid" => $order['prepay_id'],
"partnerid" => $order['mch_id'],
"timestamp" => time(),
);
$result['sing'] = $this->getSign($result);
return_msg("200","微信支付调用成功",$result);
}else{
return_msg("100","调用失败",$order);
}
}


/*
* 微信支付回调
*/
function wx_notify()
{
//接收微信返回的数据数据,返回的xml格式
$xmlData = file_get_contents('php://input');
$daparam = new \WxPayUnifiedOrder();
//将xml格式转换为数组 返回数据官网文档:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_7&index=3
$data = $this->FromXml($xmlData);
//用日志记录检查数据是否接受成功,验证成功一次以后,可删除。
$file = fopen('./log.txt', 'a+');
fwrite($file, var_export($data, true));
//为了防止假数据,验证签名是否和返回的同样。
//记录一下,返回回来的签名,生成签名的时候,必须剔除sign字段。
$sign = $data['sign'];
unset($data['sign']);
if ($sign == $this->getSign($data)) {
//判断返回微信返回的
if ($data['result_code'] == 'SUCCESS') {
//根据返回的订单号作业务逻辑
$update = array(
'status' => '2', //修改支付状态
'zhi_time' => time(), //添加支付时间
'pay_type' => 2); //添加支付类型
$re = Db::table("order")->where('ordernum', $data['out_trade_no'])->update($update);
$res = Db::table("order")->where('ordernum', $data['out_trade_no'])->field('mid,id,ordernum,nickname,addtime,pay_type')->find();
//添加充值记录
$res['payorder'] = $data['transaction_id'];
$res['money'] = number_format($data['total_fee']/100,2);
$addpay = $this->addpay($res);
//处理完成以后,告诉微信成功结果!
if ($re && $addpay) {
$str = '<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
</xml>';
return $str;
}else{
return 'tijiashibai';
}
} //支付失败,输出错误信息
else {
$file = fopen('./log.txt', 'a+');
fwrite($file, "错误信息:" . $data['return_msg'] . date("Y-m-d H:i:s"), time() . "\r\n");
return false;
}
} else {
$file = fopen('./log.txt', 'a+');
fwrite($file, "错误信息:签名验证失败" . date("Y-m-d H:i:s"), time() . "\r\n");
return false;
}
}


/*
* ***生成随机字符串,微信所需参数!
*/
function rand_code()
{
$str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';//62个字符
$str = str_shuffle($str);
$str = substr($str, 0, 32);
return $str;
}

/*
* ******生成签名*********
*/
private function getSign($params)
{
ksort($params); //将参数数组按照参数名ASCII码从小到大排序
foreach ($params as $key => $item) {
if (!empty($item)) { //剔除参数值为空的参数
$newArr[] = $key . '=' . $item; // 整合新的参数数组
}
}


$stringA = implode("&", $newArr); //使用 & 符号链接参数
$stringSignTemp = $stringA . "&key=" . config('wx_key');
// key是在商户平台API安全里本身设置的
$stringSignTemp = hash_hmac("sha256",$stringSignTemp,config('wx_key')); //将字符串进行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;
}
相关文章
相关标签/搜索