1. 支付寶支付流程

上面的圖來自官方的檔案,看起來比較繁瑣,下面的圖是流程的簡化版,

簡單解釋一下流程步驟:
1. 當用戶點擊支付寶支付的時候,客戶端請求App的服務端介面,此時,App的服務端會請求支付寶的服務器獲得生成的簽名資訊回傳給客戶端;
2. 客戶端獲取生成的簽名資訊以后,呼叫Flutter提供的支付寶SDK,傳入簽名資訊,調起支付寶支付, 用戶輸入完密碼完成支付以后,支付寶的服務器首先會給App回傳支付結果,同時,支付寶的服務器還會異步通知App的服務器進行訂單更新,
參考:https://opendocs.alipay.com/open/59/103658/
2. Flutter支付插件
參考:https://pub.dev/packages/sy_flutter_alipay
安裝插件,
dependencies:
sy_flutter_alipay: ^0.2.1
在pubspec.yaml中配置保存后,在VS Code環境中會自動下載依賴包,
如果無法正常下載,執行 flutter pub get ,
插件安裝完成以后,如果是IOS平臺,還需要提前添加urlScheme,步驟如下:
1. 用Xcode打開Flutter專案的IOS端;

2. 添加urlScheme;

注意:urlScheme填寫必須要有一定的標識度,最好與App有定的關聯,以免支付失敗,
3. 服務端呼叫支付寶SDK生成訂單資訊
根據服務端所采用的語言,下載對應的SDK,
地址:https://opendocs.alipay.com/open/54/103419/

以PHP為例,以下是參考代碼,請注意代碼中的注釋說明,
<?php
ini_set('date.timezone','Asia/Shanghai');
header("Access-Control-Allow-Origin: *");
require_once('AopSdk.php');
$aop = new AopClient;
$aop->gatewayUrl = "https://openapi.alipay.com/gateway.do";
// 應用ID(需要配置)
$aop->appId = "2017122101048570";
// 應用私鑰(需要配置)
// 請填寫開發者私鑰去頭去尾去回車,一行字串
$aop->rsaPrivateKey = 'MIIEowIBAAKCAQEA2YqSo7uX27Fdi32MEx2hAmfZUWl19KNovLLEm3P6mlQYkD7+ThVE8468n8meyTBl2QC8YXQVbGANbFdwdcxldDnOUKv7f9VFiaXn+jT0t9hJ00t5HLJ2yY85hMWFhuO+wxIjZdJ82u4dekY7F2T32wC7qIx4dsncPVfCvW4nB8Co6+eVi+PBEkp92HiBk/b4HbjhZxBCe9urbiN9syO5ZlVzAPUDcDvlRVSICv0S9BzWCQPjzxO8sd6jvJ/EFBmbz9VjvFbOkwSoibElY7kShDtAR2Ae/PTzEF2hvOUKVI/hW7T2p7VewgYF1kcPxlLoZJ8Zljxn7EYhMmsfukbPHQIDAQABAoIBAHPUS9XwWaA5ZTSTiZTYDtXoE5c8jvjOVUM78GFRNJsdseKEGAXdX1RLqPVvdiNrqJ8NvEArfgixcBRCznd6eH6VFNxxZj0fgqIS+1yG+9Iz0MM3iWoVQBh8MUUXosw60WSucLiThbVQWdO0N1xyf2JVlpXdDXs6ahEjfGY+k3uVR0No0qIBgwirM2Ofyk3orgBFxXgEbjpoAindpglrqhw2LlMMNb9wwNkjzB/guiYhRu3xOoodstPqcR/FXy0WLRc6W+pxF83E7lPJ22U3DLM2yIc4NQjGxa8Kfkhm0fQUQz5M1akRfk0nj6w8sIjd5XJKgw+Cjosh4EubHVptpyUCgYEA8DzEleQo01hdZqHLeYBghbuEuoFm+N80Xk/7i4Dxlny2R4ZO/sCH3ZURbwcI4kA2WvdScB2Lir9NI10HJNW3xJRjVpumPzfrNxLoYZb+2h0eSS6peIlMAidZyspwGEwLE+jelnMQu8IVbKQ0aTN8tjpKolbpII95Tlq58Ijf8ksCgYEA59CVDkNU+dCufVnLHkOASrd0AGmXMccKeBZfpNlZIdmH9/KBRbXiUec8TWgDwfZg8e//FMCA7r4Y4pj2XZhb+G0M3FfBf2hjKjkqVDEv9+3zYK4zI07ts2WRvkLgY+SvzFYwSEo/U72zka1ocWdDZtiNdXqqAC5DTTc6zIIsozcCgYBPDdAq+v+sPIHPyiIpA2O/3isZLIf0EY8sEenWyEG3oaZh9wJ7tmN/ORSZkpkLytGYMZbBKhfHOphpsK0vI9zrJWFjGKkmWIJghypNIuEOaVKUBnTiI1wNwWE86Ezm0e87SAAnRgoVnxJpw8czbyv0003ICg2BF3V1oUlaq8/17QKBgAD+cvUpsr6Td3wQG3/YuD8ZxESQL1bGTLQxHF3flLNBdITKpGVBH2RMgoSucn2tacL/zW8wWB0t8XtfPocuNQ6+oPR859Z9AxfWQOk1gMgmXAnJFW0MVJaVU+el78Jd46cTo4db0iOwx4lTXgRGdhKF0S10xi/UAvPczcK8uCZHAoGBAN+74UouDYmZaAfzj5O0857ZVHBiXtJ5AasYqbBALZ17EqTjscYcD3nlvWhoX7JtGAyU09fuH23NK6hpi3yk67KUBuJOab+wjjDUIIAveFqjmiaV+Ra727v39d2ide534ikOfz04RDiAUVA43V+a3kdaAXuvTfhF+mczjN3joFtm' ;
$aop->format = "json";
$aop->charset = "UTF-8";
$aop->signType = "RSA2";
// 支付寶公鑰
// 請填寫支付寶公鑰,一行字串
$aop->alipayrsaPublicKey = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhb/KlxYfhRE8KRp92MQM8ZB8NVjoM9LYFOnPIuNtcMZVA8ld7ybDP2FiA+QEE7wLGqMImwl1Y4xzkrTLCjHVC8fdR8ZvzZR2I3ZOrARerI9+RbkCfT+7YLv55+A+WTHEyiB+v7PfXVTT28s0CHNLPXMyQD1u8UVEQEpbMSs8hH3pJF55Li7kc5VvJpV3RVO9TXZTVAA5mSp9FvO3u+47IJDgFVLnqqHh6ETL1nHVpxiAY2LGer+RWpVYD8v+We+VWsrfJP7bO0xr2pwizldepo8YNYPgcIAIwd7KiveypL1pA0xWgSjUHzrkVh1j/nSnvJgKSdydU/VRcaVt/Mt8wwIDAQAB';//對應填寫
// 實體化具體API對應的request類,類名稱和介面名稱對應,當前呼叫介面名稱:alipay.trade.app.pay
$request = new AlipayTradeAppPayRequest();
// SDK已經封裝掉了公共引數,這里只需要傳入業務引數
$date=date("YmdHis");
// 注意:下面除了body描述不是必填,其他必須有,否則失敗
$bizcontent = json_encode(array(
// 以下資料根據實際專案而定,此處寫死了
'body'=>'我是測驗資料',
// 支付的標題
'subject' => 'App支付測驗111',
// 支付寶訂單號必須是唯一的,不能在支付寶再次使用,必須重新生成,哪怕是同一個訂單,不能重復
// 否則二次支付時候會失敗,訂單號可以在自己訂單那里保持一致,但支付寶那里必須要唯一,具體處理自己操作
'out_trade_no' => $date.'st11',
// 過期時間(分鐘)
'timeout_express' => '30m',
// 金額最好能要保留小數點后兩位數
'total_amount' => '0.01',
'product_code' => 'QUICK_MSECURITY_PAY'
));
// 在應用那里設定的異步回呼地址
$request->setNotifyUrl("http://agent.itying.com/alipay/notify_url.php");
$request->setBizContent($bizcontent);
// 這里和普通的介面呼叫不同,使用的是sdkExecute
$response = $aop->sdkExecute($request);
echo $response;
// 輸出結果
// echo htmlspecialchars($response);
?>
4. 客戶端支付的實作
import 'package:flutter/material.dart';
import 'package:sy_flutter_alipay/sy_flutter_alipay.dart';
import 'package:dio/dio.dart';
class AliPay extends StatefulWidget {
AliPay({Key key}) : super(key: key);
_AliPayState createState() => _AliPayState();
}
class _AliPayState extends State<AliPay> {
// 執行支付寶支付
_doAliPay() async {
// App服務端的地址(根據業務需要傳入對應的引數,此處省略了)
var serverApi = "http://agent.itying.com/alipay/";
var serverData = await Dio().get(serverApi);
var payInfo = serverData.data;
var result = await SyFlutterAlipay.pay(
// 請求App服務端獲取的簽名資訊
payInfo,
// 前面配置的urlScheme,只對IOS有效
// urlScheme: '你的ios urlScheme',
// 是否是沙箱環境,只對Android有效
// isSandbox: true
);
// 獲取資訊以后,跳轉到訂單串列
print(result);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('支付寶支付'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
RaisedButton(
child: Text('支付寶支付'),
onPressed: _doAliPay,
)
],
)
)
);
}
}
5. 服務器端異步回呼更新訂單資訊
<?php
ini_set('date.timezone','Asia/Shanghai');
header("Access-Control-Allow-Origin: *");
require_once('AopSdk.php');
$aop = new AopClient;
// 請填寫支付寶公鑰,一行字串;
$aop->alipayrsaPublicKey='MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhb/KlxYfhRE8KRp92MQM8ZB8NVjoM9LYFOnPIuNtcMZVA8ld7ybDP2FiA+QEE7wLGqMImwl1Y4xzkrTLCjHVC8fdR8ZvzZR2I3ZOrARerI9+RbkCfT+7YLv55+A+WTHEyiB+v7PfXVTT28s0CHNLPXMyQD1u8UVEQEpbMSs8hH3pJF55Li7kc5VvJpV3RVO9TXZTVAA5mSp9FvO3u+47IJDgFVLnqqHh6ETL1nHVpxiAY2LGer+RWpVYD8v+We+VWsrfJP7bO0xr2pwizldepo8YNYPgcIAIwd7KiveypL1pA0xWgSjUHzrkVh1j/nSnvJgKSdydU/VRcaVt/Mt8wwIDAQAB';
$flag = $aop->rsaCheckV1($_POST, NULL, "RSA2");
file_put_contents('post.txt',json_encode($_POST));
// $flag回傳是的布林值,可以根據這個判斷是否支付成功
if($flag){
// 驗證成功
// 這里可以做一下你自己的訂單邏輯處理
file_put_contents('success.txt',json_encode($_POST));
// 這個必須回傳給支付寶,
echo 'success';
} else {
// 驗證失敗
file_put_contents('fail.txt','失敗');
echo "fail";
}
?>
當支付成功后,支付寶會異步給服務器發送資料,所以要在支付寶后臺提前配置好授權回呼地址,
6. 編譯錯誤解決
專案配置成功后,建議首先在Flutter中執行 flutter run , 以便下載相關的依賴,
Xcode上編譯打包時可能會提示 :Target 'Runner': script phase “ [CP] Embed Pods Frameworks”,
解決方法:打開Xcode,點擊File選單,選擇Workspace Settings,將Build System修改成如下所示的選項,

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/258458.html
標籤:其他
