引入该文件 WechatAppPay.php
下载地址: http://pan.baidu.com/s/1qXMnLhy
以下代码是统一下单获取预支付订单号
具体代码如下
<?php
/**
* Created by PhpStorm.
* User: 喵小猫
* Date: 2017/3/31
* Time: 11:28
*/
namespace PaymentController;
use CommonControllerFrontbaseController;
class WxpayController extends FrontbaseController{
//api--获取的订单号
public function wechatPay(){
require_once C(EXTEND_PATH)."/Wxpay/WechatAppPay.php";
$appid = "wx************";
$mch_id = "**商户id**";
$notify_url = "http://**********/application/Payment/notify.php";
$key = "*******商户秘钥*********";
$description = I("description");//商品描述
$wxPrice = I("wxPrice"); //订单金额 只能为整数 单位为分
$tradeNo = I("tradeNo"); //自定义的订单号
//1.统一下单方法
$wechatAppPay = new WechatAppPay($appid, $mch_id, $notify_url, $key);
$params["body"] = $description; //商品描述
$params["out_trade_no"] = $tradeNo; //自定义的订单号
$params["total_fee"] = $wxPrice; //订单金额 只能为整数 单位为分
$params["trade_type"] = "APP"; //交易类型 JSAPI | NATIVE | APP | WAP
$result = $wechatAppPay->unifiedOrder( $params );
// print_r($result); // result中就是返回的各种信息信息,成功的情况下也包含很重要的prepay_id
//2.创建APP端预支付参数
/** @var TYPE_NAME $result */
$data = @$wechatAppPay->getAppPayParams( $result["prepay_id"] );
// 根据上行取得的支付参数请求支付即可
if($data){
$arr["status"] = 1;
$arr["appid"] = $data["appid"]; //应用APPID
$arr["partnerid"] = $data["partnerid"]; //商户号
$arr["prepayid"] = $data["prepayid"]; //预支付交易会话标识
$arr["package"] = $data["package"]; //交易类型
$arr["noncestr"] = $data["noncestr"]; //微信返回的随机字符串
$arr["timestamp"] = $data["timestamp"]; //时间戳
$arr["sign"] = $data["sign"]; //微信返回的签名
}else{
$arr["status"] = 0;
$arr["msg"] = "获取微信返回信息失败";
}
$this->output($arr);
}
}
回调部分
<?php
/**
* Created by PhpStorm.
* User: 喵小猫
* Date: 2017/5/18
* Time: 14:46
*/
//include_once ("./log_.php");
//$log = new log_();
//$log_name="../../data/runtime/Logs/notify_url.log";//log文件路径
$xml = file_get_contents("php://input");
//$log->log_result($log_name,"【xml】:
".json_encode($xml)."
");
$arr = json_decode(json_encode(simplexml_load_string($xml, "SimpleXMLElement", LIBXML_NOCDATA)), true);
//$log->log_result($log_name,"【arr】:
".json_encode($arr)."
");
$post = array();
$post["appid"] = $arr["appid"];
$post["mch_id"] = $arr["mch_id"];
$post["nonce_str"] = $arr["nonce_str"];
$post["out_trade_no"] = $arr["out_trade_no"];
$post["total_fee"] = $arr["total_fee"];
$post["notify_url"] = $arr["notify_url"];
$post["trade_type"] = $arr["trade_type"];
$post["openid"] = $arr["openid"];
$post["bank_type"] = $arr["bank_type"];
$post["cash_fee"] = $arr["cash_fee"];
$post["fee_type"] = $arr["fee_type"];
$post["is_subscribe"] = $arr["is_subscribe"];
$post["result_code"] = $arr["result_code"];
$post["return_code"] = $arr["return_code"];
$post["time_end"] = $arr["time_end"];
$post["transaction_id"] = $arr["transaction_id"];
//$log->log_result($log_name,"【post】:
".json_encode($post)."
");
//排序
ksort($post);
//生成sign
$str = urldecode(http_build_query($post))."&key=lituoquanjingrongfuwupingtai1990";
$sign = strtoupper(md5($str));
//$log->log_result($log_name,"【sign】:
".$sign."
");
if($sign === $arr["sign"]){
// $log->log_result($log_name,"【验证】:
".验证成功."
");
//此处处理业务逻辑
// $log->log_result($log_name,"【sql】:
".$sql."
");
}
$xml = "<xml>";
foreach ($post as $key=>$val){
if(is_array($val)){
$xml.="<".$key.">".arrayToXml($val)."</".$key.">";
}else{
$xml.="<".$key.">".$val."</".$key.">";
}
}
$xml.="</xml>";
return $xml;
回调中用到的log类
<?php
/**
* Created by PhpStorm.
* User: 喵小猫
* Date: 2017/5/19
* Time: 10:28
*/
class Log_
{
// 打印log
function log_result($file,$word)
{
$fp = fopen($file,"a");
flock($fp, LOCK_EX) ;
fwrite($fp,"执行日期:".strftime("%Y-%m-%d-%H:%M:%S",time())."
".$word."
");
flock($fp, LOCK_UN);
fclose($fp);
}
}