微信APP支付,支付寶APP支付demo

最近公司新開發的APP中,須要集成微信支付和支付寶支付,2個平臺申請的都是APP支付。這是我的第一次單獨的,完整的作完2個平臺的支付。html

這裏我主要用到了2個接口:支付接口,訂單查詢接口,雖然2個平臺的文檔都挺齊全,但開發下來,仍是踩了很多坑,記錄下來,或許對後來人有用。前端

先來講支付寶SDK:express

  瞭解3個概念:應用公鑰,應用私鑰和支付寶公鑰api

  開發人員用支付寶提供的祕鑰生成工具生成的祕鑰,即爲應用公鑰和應用私鑰。微信

  開發人員在給支付寶APP配置應用公鑰後,支付寶主動生成了一個公鑰,即爲支付寶公鑰。app

  配置以下圖示:函數

       

  須要把這個支付寶公鑰保存下來,具體使用場景,請看後續說明。工具

  這裏我的用到了2個接口,生成支付訂單信息和訂單查詢。微信支付

  支付寶提供了服務端SDK的下載:https://docs.open.alipay.com/54/106370/url

  其目錄顯示:

  

  下面直接給出支付、回調、訂單查詢的代碼:

// 生成支付信息
function pay() {
$aop = new AopClient;
$aop->gatewayUrl = '網關地址';
$aop->appId = 'alipay_appid';
$aop->rsaPrivateKey = '應用私鑰';
$aop->signType = "RSA2";
$aop->alipayrsaPublicKey = '支付寶公鑰';

$request = new AlipayTradeAppPayRequest();

$bizcontent = "{\"body\":\"帳戶充值\","
. "\"subject\": \"用戶帳戶充值\","
. "\"out_trade_no\": \"訂單號\","
. "\"timeout_express\": \"30m\","
. "\"total_amount\": \"訂單金額\","
. "\"product_code\":\"QUICK_MSECURITY_PAY\""
. "}";
$request->setNotifyUrl('開發者回調地址');
$request->setBizContent($bizcontent);
$response = $aop->sdkExecute($request);

// 注意: 官方demo裏,這裏加了htmlspecialchars方法,實際上是錯誤的,應該去掉,不然會報ALI38173錯誤
echo $response;
}

// 回調
function callback() {
$aop = new AopClient ();
$aop->alipayrsaPublicKey = '支付寶公鑰';

// 支付寶回調是以POST方式提交過來的
$result = $aop->rsaCheckV1($_POST, null, $_POST['sign_type']);

if ($result) {
// TODO 驗證訂單號,支付金額,支付寶狀態等信息
echo 'success';
} else {
echo 'error';
}
}

// 訂單查詢
function queryOrder() {
$aop = new AopClient ();
$aop->signType = "RSA2";
$aop->gatewayUrl = '網關地址';
$aop->appId = 'appid';
$aop->rsaPrivateKey = '應用私鑰';

// 注意:這裏是支付寶公鑰,不是應用公鑰
$aop->alipayrsaPublicKey = '支付寶公鑰';

$request = new AlipayTradeQueryRequest ();
$request->setBizContent("{" .
"\"out_trade_no\":\"訂單號\"," .
"\"trade_no\":\"交易單號\"" .
"}");
$result = $aop->execute($request);

$responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
$resultCode = $result->$responseNode->code;

if(! empty($resultCode) && $resultCode == 10000) {
if ($result->$responseNode->trade_status == 'TRADE_SUCCESS') {
// 支付成功, 更新訂單狀態,用戶帳戶餘額,帳戶變化日誌
}
}
}

 

微信支付:

  在開發平臺申請app支付:https://open.weixin.qq.com/

  審覈經過後,須要配置開發信息

  

  服務端PHP的demo:

// 生成支付信息
function pay() { $input = new WxPayUnifiedOrder(); $input->SetBody('支付標題'); $input->SetAttach('附加信息'); // 附加信息
    $input->SetOut_trade_no('訂單號'); $input->SetTotal_fee('訂單金額,單位分'); //微信支付,單位(分)
    $input->SetTime_start(date("YmdHis")); $input->SetTime_expire(date("YmdHis", time() + 600)); $input->SetGoods_tag('附屬信息'); $input->SetNotify_url('回調地址'); $input->SetTrade_type("APP"); // 生成預支付訂單ID:prepay_id
    $unifiedOrder = WxPayApi::unifiedOrder($input); // 生成簽名,返回給APP前端調用
    $result = makeWxPaySign($unifiedOrder); } // 生成簽名
function makeWxPaySign($UnifiedOrderResult) { if(! array_key_exists("appid", $UnifiedOrderResult) || ! array_key_exists("prepay_id", $UnifiedOrderResult) || empty($UnifiedOrderResult['prepay_id'])) { throw new WxPayException("參數錯誤"); } $api = new WxPayAppPay(); $api->SetValue('appid', $UnifiedOrderResult["appid"]); $api->SetValue('package', "Sign=WXPay"); $api->SetValue('prepayid', $UnifiedOrderResult['prepay_id']); // 預支付訂單號 $api->SetValue('partnerid', WxPayConfig::MCHID); // 商戶號 $api->SetValue('noncestr', WxPayApi::getNonceStr()); // 隨機數 $api->SetValue('timestamp', (string)time()); // 對上面參數進行簽名
    $api->SetValue('sign', $api->MakeSign()); return $api->GetValues(); } // 回調,繼承微信SDK的回調類
class PayNotifyCallBack extends WxPayNotify { //重寫回調處理函數
    public function NotifyProcess($data, &$msg) { if (! array_key_exists("transaction_id", $data)) { return false; } // 調用訂單查詢方法,判斷訂單真實性

        return true; } } // 訂單查詢
function queryOrder() { $input = new WxPayOrderQuery(); $input->SetTransaction_id('支付平臺交易號'); $input->SetOut_trade_no('公司平臺單號'); // 訂單查詢結果
    $result = WxPayApi::orderQuery($input); if(array_key_exists("return_code", $result) && array_key_exists("result_code", $result) && array_key_exists('trade_state', $result) && $result["return_code"] == "SUCCESS"
        && $result["result_code"] == "SUCCESS"
        && $result["trade_state"] == "SUCCESS") { // 交易成功,todo 更新訂單狀態,用戶帳戶餘額,帳戶變化日誌
 } }
相關文章
相關標籤/搜索