/*支付寶第三方支付
*
*生成APP支付訂單信息
* @param number uid 用戶id
* @param string token 用戶token
* @param number oid 訂單id
* @param string title 標題
* @param string body 商品描述
* @parma float money 金額
* @param number ordernum 訂單編號
*/
支付包官方文檔 https://docs.open.aliyun.com/54/106370/
public function zfb_pay()
{
$data = input('post.');
Loader::import('/alipay/aop/AopClient',EXTEND_PATH);
$aop = new \AopClient();
$aop->appId = config("alipay_app_id");
$aop->rsaPrivateKey = config('alipay_private_key');
$aop->alipayrsaPublicKey = config('alipay_public_key');//對應填寫
$aop->signType = "RSA2";
//實例化具體API對應的request類,類名稱和接口名稱對應,當前調用接口名稱:alipay.trade.app.pay
Loader::import('/alipay/aop/request/AlipayTradeAppPayRequest',EXTEND_PATH);
$request = new \AlipayTradeAppPayRequest();
//SDK已經封裝掉了公共參數,這裏只須要傳入業務參數
$bizcontent = json_encode(array(
'body' => $data['body'], //商品描述
'subject' => $data['title'], //支付的標題,
'out_trade_no' => $data['ordernum'], //支付寶訂單號必須是惟一的,只能生成一次
'total_amount' => $data['money'], //金額
"timeout_express" => "30m", //訂單支付有效時間 m分鐘 h小時
'product_code' => 'QUICK_MSECURITY_PAY'
));
$request->setNotifyUrl("http://tapi.zuozuobang.com/notifyurl");//你在應用那裏設置的異步回調地址
$request->setBizContent($bizcontent);
//這裏和普通的接口調用不一樣,使用的是sdkExecute
$response = $aop->sdkExecute($request);
//htmlspecialchars是爲了輸出到頁面時防止被瀏覽器將關鍵參數html轉義,實際打印到日誌以及http傳輸不會有這個問題
/* echo htmlspecialchars($response);*///就是orderString 能夠直接給客戶端請求,無需再作處理。
if($response){
return_msg('200','支付寶請求成功!',$response);
}else{
return_msg('100','支付請求失敗!',$response);
}
}
/*
* 支付寶支付回調
*/
public function notifyurl()
{
Loader::import('/alipay/aop/AopClient',EXTEND_PATH);
$aop = new \AopClient();
$aop->alipayrsaPublicKey =config('alipay_public_key');//對應填寫
$flag = $aop->rsaCheckV1($_POST, NULL, "RSA2");
if ($flag) {
//校驗通知數據的正確性
$out_trade_no = $_POST['out_trade_no']; //商戶訂單號
$trade_no = $_POST['trade_no']; //支付寶交易號
$trade_status = $_POST['trade_status']; //交易狀態trade_status
$total_amount = $_POST['total_amount']; //訂單的實際金額
$order = Db::table("shfw_order")->where('ordernum', $out_trade_no)->find();
if ($order) {
//只有交易通知狀態爲TRADE_SUCCESS或TRADE_FINISHED時,支付寶纔會認定爲買家付款成功。
if ($trade_status != 'TRADE_FINISHED' && $trade_status != 'TRADE_SUCCESS') {
return 'fail';
}
//二、判斷total_amount是否確實爲該訂單的實際金額(即商戶訂單建立時的金額);
if ($total_amount != $order['money']) {
return 'fail';
}
//校驗成功後在response中返回success,校驗失敗返回failure
$update = array(
'status' => '2', //修改支付狀態
'zhi_time' => time(), //添加支付時間
'pay_type' => 1); //添加支付類型
$result = Db::table("shfw_order")->where('ordernum', $out_trade_no)->update($update);
$res = Db::table("shfw_order")->where('ordernum', $out_trade_no)->field('id,mid,ordernum,nickname,addtime,pay_type')->find();
// $member = Db::table('shfw_member')->where('id',$res['mid'])->find();
//添加充值記錄
$res['payorder'] = $trade_no;
$res['money'] = $total_amount;
$addpay = $this->addpay($res);
if ($result && $addpay) {
return "success";
} else {
return 'fail';
}
} else {
exit('fail');
}
}
}