# 1.支付寶-App移動支付
支付寶 , 移動端通過獲取服務端返回的字符串掉起支付寶客戶端
```
<?php
namespace app\api\service;
/*
* 支付寶支付接口
*
* */
require_once (EXTEND_PATH.'alipay03/AopSdk.php');
class AliPay
{
/**
*生成APP支付訂單信息
* @param string $orderId 商品訂單ID
* @param string $subject 支付商品的標題
* @param string $body 支付商品描述
* @param float $pre_price 商品總支付金額
* @param int $expire 支付交易時間
* @return bool|string 返回支付寶簽名后訂單信息,否則返回false
*/
public function unifiedorder($orderId, $subject,$body,$pre_price,$expire){
/*支付寶老版本(2016年8月份) 服務端無需SDK,直接RSA加密拼接字符串*/
$mygoods['partner'] = '"'.config('text.qnm_aliapy_partner').'"';
$mygoods['seller_id'] = '"'.config('text.qnm_alipay_sellerid').'"';
$mygoods['out_trade_no'] = '"'.$orderId.'"';
$mygoods['subject'] = '"'.$subject.'"';
$mygoods['body'] = '"'.$body.'"';
$mygoods['total_fee'] = '"'.$pre_price.'"';
$mygoods['notify_url'] = '"'.config('text.qnm_aliacall_url').'"';
$mygoods['service'] = "\"mobile.securitypay.pay\"";
$mygoods['payment_type'] = "\"1\"";
$mygoods['_input_charset'] = "\"utf-8\"";
$mygoods['it_b_pay'] = "\"30m\"";
// 數組拼接成字符串
$mystr = $this->createLinkstring($mygoods);
//生成最終簽名信息
$sign = $this->rsaSign($mystr,'/home/canmay/www/test.qunarmeic.com/public/key/alia_prikey.pem');
$sign = urlencode($sign);
//生成最終簽名信息
$rest = $mystr.'&sign="'.$sign.'"&sign_type="RSA"';
return $rest;
/*支付寶新版本,需要引入官網下載的SDK*/
$aop = new \AopClient();
$aop->gatewayUrl = "https://openapi.alipay.com/gateway.do";
$aop->appId = config('alia_pay.appid');
$aop->rsaPrivateKey = config('alia_pay.private_key');
$aop->format = "json";
$aop->charset = "UTF-8";
$aop->signType = "RSA2";
$aop->alipayrsaPublicKey = config('alia_pay.public_key');
//實例化具體API對應的request類,類名稱和接口名稱對應,當前調用接口名稱:alipay.trade.app.pay
$request = new \AlipayTradeAppPayRequest();
//SDK已經封裝掉了公共參數,這里只需要傳入業務參數
$bizcontent = "{\"body\":\"{$body}\"," //支付商品描述
. "\"subject\":\"{$subject}\"," //支付商品的標題
. "\"out_trade_no\":\"{$orderId}\"," //商戶網站唯一訂單號
. "\"timeout_express\":\"{$expire}m\"," //該筆訂單允許的最晚付款時間,逾期將關閉交易
. "\"total_amount\":\"{$pre_price}\"," //訂單總金額,單位為元,精確到小數點后兩位,取值范圍[0.01,100000000]
. "\"product_code\":\"QUICK_MSECURITY_PAY\""
. "}";
$request->setNotifyUrl(config('alia_pay.notify_url'));
$request->setBizContent($bizcontent);
//這里和普通的接口調用不同,使用的是sdkExecute
$response = $aop->sdkExecute($request);
//htmlspecialchars是為了輸出到頁面時防止被瀏覽器將關鍵參數html轉義,實際打印到日志以及http傳輸不會有這個問題
return $response;
}
/*************************需要使用到的方法*******************************/
/**
* 把數組所有元素,按照“參數=參數值”的模式用“&”字符拼接成字符串
* @param $para 需要拼接的數組
* return 拼接完成以后的字符串
*/
private function createLinkstring($para) {
$arg = "";
while (list ($key, $val) = each ($para)) {
$arg.=$key."=".$val."&";
}
//去掉最后一個&字符
$arg = substr($arg,0,count($arg)-2);
//如果存在轉義字符,那么去掉轉義
if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}
return $arg;
}
/**
* 對數組排序
* @param $para 排序前的數組
* return 排序后的數組
*/
private function argSort($para) {
ksort($para);
reset($para);
return $para;
}
/**
* RSA簽名
* @param $data 待簽名數據
* @param $private_key_path 商戶私鑰文件路徑
* return 簽名結果
*/
private function rsaSign($data,$private_key_path) {
$priKey = file_get_contents($private_key_path);
$res = openssl_get_privatekey($priKey);
openssl_sign($data, $sign, $res);
openssl_free_key($res);
//base64編碼
$sign = base64_encode($sign);
return $sign;
}
/**RSA驗簽
* $data待簽名數據
* $sign需要驗簽的簽名
* 驗簽用支付寶公鑰
* return 驗簽是否通過 bool值
*/
private function verify($data, $sign) {
//讀取支付寶公鑰文件
$pubKey = file_get_contents('key/alipay_public_key.pem');
//轉換為openssl格式密鑰
$res = openssl_get_publickey($pubKey);
//調用openssl內置方法驗簽,返回bool值
$result = (bool)openssl_verify($data, base64_decode($sign), $res);
//釋放資源
openssl_free_key($res);
//返回資源是否成功
return $result;
}
}
```