关于ThinkPHP下微信扫码支付的记录(模式二)

1.获取二维码

function get_wx_src(){

//模式二
/**
* 流程:
* 1、调用统一下单,取得code_url,生成二维码
* 2、用户扫描二维码,进行支付
* 3、支付完成之后,微信服务器会通知支付成功
* 4、在支付成功通知中需要查单确认是否真正支付成功(见:notify.php)
*/
$out_trade_no = I('post.code');  //系统订单号
if(C('pay_test_switch')===true) {  //是否开启正式支付
$total_fee = 1; //付款金额 //必填 通过支付页面的表单进行传递 1fen
}else{
$total_fee = I('post.order_last_fee') * 100;
}
$attach = "自定义字符串"
$notify = new \NativePay();
$input = new \WxPayUnifiedOrder();
$input->SetBody('赞赞的商品描述'); //商品简单描述
$input->SetAttach($attach); //附加数据,可作为自定义参数
$input->SetOut_trade_no($out_trade_no); //订单号,32个字符内
$input->SetTotal_fee($total_fee); //订单总金额,单位为分
$input->SetTime_start(date("YmdHis")); //订单生成时间
$input->SetTime_expire(date("YmdHis", time() + 600)); //订单失效时间
$input->SetGoods_tag("test"); //订单优惠标记
$input->SetNotify_url(C('wxpay_config.notify_url')); //服务器异步通知页面路径)
$input->SetTrade_type("NATIVE"); //交易类型--扫码支付
$input->SetProduct_id($out_trade_no); // NATIVE 时必传,商品id
$result = $notify->GetPayUrl($input);
$url = $result["code_url"];    //支付Url

$data['error'] = 0;
$data['url'] = $url;
return $this->ajaxReturn($data);

}

 

2.服务器的异步通知方法

/******************************
服务器异步通知页面方法

*******************************/
/**
* 验证
* @return array 返回数组格式的notify数据
*/
public function notifyurl(){

// 获取xml
$xml=file_get_contents('php://input','r');

// 转成php数组
$data=$this->toArray($xml);

if ($data['return_code']=='SUCCESS' && $data['result_code']=='SUCCESS') {  //判断状态是否为返回成功

$out_trade_no = $data["out_trade_no"];
$input = new \WxPayOrderQuery();
$input->SetOut_trade_no($out_trade_no);
$result = \WxPayApi::orderQuery($input);  //去微信服务器验证正确性

if ($result['return_code']=='SUCCESS' && $result['result_code']=='SUCCESS'){  //真正的验证通过
$result=$data;
$openid = $data['openid']; //用户标识
$trade_type = $data['trade_type']; //交易类型 NATIVE
$total_fee = $data['total_fee']; //订单金额
$transaction_id = $data['transaction_id']; //微信支付订单号
$attch = $data['attach']; //自定义信息
$out_trade_no = $data['out_trade_no']; //订单code
$time_end= $data['time_end']; //订单code

$extra_info = explode(',',$attch);
//add wx

$parameter = array(  // 存储微信支付信息
'code' => $out_trade_no,
'transaction_id' => $transaction_id,
'openid' => $openid,
'total_fee' => $total_fee,
'trade_type' => $trade_type,
'time_end' => $time_end,
'create_time' => time()
);
}else{
$result=false;
}
}else{
$result=false;
}
// 返回状态给微信服务器
if ($result) {
$str='<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
}else{
$str='<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名失败]]></return_msg></xml>';
}
echo $str;

}

 

3.其他方法

/**
* 将xml转为array
* @param string $xml xml字符串
* @return array 转换得到的数组
*/
public function toArray($xml){
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
$result= json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $result;
}

posted @ 2017-08-18 15:54  赞赞的梦想  阅读(483)  评论(0编辑  收藏  举报