Основной частью процесса покупок в электронной коммерции является оплата пользователем. В настоящее время мы обслуживаем 30 стран и регионов.Разным странам часто необходимо подключаться к различным сторонним платежным компаниям.Поэтому за последние два года команда R&D связалась с большим количеством сторонних платежных компаний и накопила определенный опыт.
В этой статье в основном рассказывается, как подключиться к сторонним платежам, а также о некоторых проблемах, с которыми действительно приходится сталкиваться в продакшене, чтобы никто не наступал на яму повторно.
Один, пять интерфейсов
Чтобы кратко объяснить, при подключении к сторонним платежам вам необходимо подключить следующие пять основных интерфейсов.
1. Инициировать платеж
Этот интерфейс в основном используется для получения токенов от третьих лиц.Когда пользователь переходит на сторонний веб-сайт для оплаты, сторонняя платежная компания использует его, чтобы проверить, является ли запрос на оплату законным.
2. Запрос результата платежа
Продавцы используют этот интерфейс, чтобы определить, был ли результат платежа успешным или нет.
3. Возврат
Продавцы используют этот интерфейс для возврата
4. Запрос на возврат
Продавцы используют этот интерфейс, чтобы определить, является ли результат возврата успешным или нет.
5. Получить интерфейс списка оплаченных заказов
Продавцы используют этот интерфейс для получения списка всех успешных платежных поручений третьей стороны в определенный день, который используется для сверки.
Два, четыре процесса
Вам нужно всего лишь выполнить следующие четыре процесса, чтобы завершить подключение стороннего платежа.
- Инициировать платежный запрос
- Синхронные и асинхронные обратные вызовы
- Возвраты и запросы на возврат
- примирение
1. Инициируйте платежный запрос
В приведенной ниже диаграмме последовательности есть несколько существительных. Позвольте мне сначала представить их вам.
- Система электронной коммерции: система обслуживания зарубежных торговых центров, отвечающая за обеспечение всего процесса покупок.
- Платежный шлюз: мы выделили платежи в отдельную систему, которая объединяет все платежи.
Временная диаграмма
Поддельный код
#商城系统
function pay(){
#1.请求支付网关,获取发起支付必要信息(token,跳转url)
$res = $this->payRequest($orderInfo,$sign);
#2.根据返回结果,跳转到第三方,进行支付
redirect($res['url']);
}
#支付网关
function payment(){
#1.检查请求数据的签名
$this->checkSign();
#2.初始化订单数据,将传入参数格式化为需要的结构
$this->initData();
#3.参数检查
$this->checkParam();
#4.记录请求日志
$this->savePayLog();
#5.发起支付
#5.1不是首次支付,则检查是否支付成功过
if(!$isFirstRequest){
$this->checkPaymentStatus();
}
#5.2生成新的支付号
$transactionCode = $this->getNewTransactionCode();
#5.3请求第三方,获取token,跳转链接等信息
$res = $this->pay($transactionCode);
return $res;
}
пункт объяснения
- Проверка подписи: доменное имя интерфейса оплаты запроса является доменным именем внутренней сети, а проверка подписи используется для повышения безопасности системы.
- Запись лога запросов: Помимо записи запроса в лог-файл, рекомендуется хранить его в библиотеке, что удобно для поиска в будущем.
- Оценка статуса платежа для непервичных платежей: во избежание повторных платежей, это суждение может быть понижено в периоды пиковой нагрузки.
- Создать новый номер платежа: некоторые сторонние платежные компании оговаривают, что один и тот же номер платежа можно использовать только один раз, независимо от того, был ли платеж успешным или нет. В настоящее время на Xiaomi.com после успешного создания заказа номер заказа не изменится, поэтому каждый раз, когда пользователь инициирует платеж, платежный шлюз будет генерировать новый номер платежа и использовать номер платежа для запроса третьей стороны. Программа познакомитпроблема двойной оплаты, решение объяснено в следующих главах.
Пример
- surl: после оплаты третья сторона вызовет URL-адрес, чтобы сообщить платежному шлюзу о результате платежа.Этот процесс называется синхронным обратным вызовом.
- pay_url: нужно перейти на сторонний URL
- хеш: третья сторона использует хеш, чтобы проверить, является ли запрос законным.
2. Синхронные и асинхронные обратные вызовы
После оплаты сторонний платеж уведомит платежный шлюз о результате платежа. Обычно есть две схемы реализации уведомлений
- Синхронный обратный вызов: обратный вызов через интерфейс обратного вызова, предоставляемый платежным шлюзом, сразу после оплаты. URL-адрес интерфейса обычно передается третьей стороне в качестве параметра при инициировании платежа.
- Асинхронный обратный вызов: После оплаты сторонний платеж будет вызывать API, предоставленный стыковочной стороной.Этот API обычно предоставляется третьей стороне при стыковке, и третья сторона настраивается в своей собственной системе. Асинхронный обратный вызов имеет механизм повторной попытки.Если контрагент не возвращает указанный результат, например, если httpcode не равен 200, он повторит попытку через определенный период времени и прекратит повторную попытку, пока указанная повторная попытка не будет подключена к сети.
**Синхронные обратные вызовы и асинхронные обратные вызовы являются важными гарантиями стабильности и точности платежной системы. **Основная логика этих двух процессов одинакова, поэтому здесь они описываются вместе.
Временная диаграмма
Поддельный код
#2.同步回调 异步回调
#支付网关
function callback()
{
#1.记录请求日志
$this->savePayLog();
#2.检查第三方传入数据是否合法
$this->checkCallbackData();
#3.检查第三方签名是否合法
$this->checkign();
#4.根据传入数据/调用第三方查询接口判断该订单在第三方系统里是否支付成功
$this->checkPaymentStatus();
#5.记录返回数据
$this->saveResponseLog();
#6.更改订单状态
#6.1如果订单是待支付状态,则更新支付网关内的订单状态,同时通知订单中心支付完成,可出库
if ($orderStatus == "待支付") {
$this->updateOrderStatusFinish();
$this->notifyOC();
#6.2如果订单已经支付完成
} elseif($orderStatus == "已经支付完成") {
if("相同的支付方式,第三方交易号也相同"){
#6.2.1重复通知,幂等处理
$this->notifyOC();
}elseif("相同的支付方式,不同的交易号"){
#6.2.2同渠道重复支付,将该信息记入重复支付表,进行退款
$this->addRepeatPayment();
}elseif("不同的支付方式"){
#6.2.3不同渠道重复支付,将该信息记入重复支付表,进行退款
$this->addRepeatPayment();
}
}
#7.根据订单状态,跳转到支付成功/失败页面
if("是同步回调"){
redirect("电商支付成功/失败页面");
}
}
пункт объяснения
- Журнал: записываются как входящие, так и возвращаемые данные
- Проверка подписи: очень важно проверять стороннюю подпись, что является одним из решений для предотвращения атак других.
- Оценка успешности платежа: когда позволяет ситуация, рекомендуется запросить сторонний интерфейс запроса, чтобы определить, был ли платеж успешным.Это второе решение для предотвращения атак других.
- Перейти на страницу успешного/неудачного платежа: когда платеж инициирован, URL-адрес страницы успешного или неудачного платежа будет передан платежному шлюзу. Причина, по которой этот URL-адрес передается при запросе платежа, заключается в том, что разные терминалы имеют разные URL-адреса.
- Этот процесс требует двух сценариев синхронизации для поддержки
- Уведомить центр обработки заказов о завершении платежа. Потому что одновременно изменить статус заказа платежной системы и уведомить центр заказов может и не получиться.
- Автоматический возврат средств за повторные платежные поручения
Пример
3. Возврат
Общий процесс возврата обычно выглядит следующим образом: финансовая система инициирует запрос на возврат к платежному шлюзу, и платежный шлюз записывает возврат в таблицу. Платежная система регулярно осуществляет возврат, а финансовая система регулярно проверяет статус возврата.
Временная диаграмма
Поддельный код
#3.退款
#支付网关
function refund(){
#1.获取待退款列表
$refundList = $this->getNotRefundList();
foreach ($refundList as $item){
#2.检查数据,订单是否支付成功,退款金额是否小于订单金额
$this->checkRefundParams();
#3.记录退款请求数据
$this->saveRefundReqData();
#4.查询退款结果
$this->checkRefundStatus();
#5.调用第三方接口进行退款
$this->refund();
#6.记录第三方返回数据
$this->saveRefundResponse();
#7.更新退款状态
$this->updateRefundStatus();
}
}
пункт объяснения
-
Тип возврата: Обычно существует два типа возмещения
-
Частичный возврат: некоторые сторонние компании не поддерживают его, и вам необходимо проконсультироваться заранее
-
полное возмещение
-
-
Список ожидающих возврата средств: рекомендуется обрабатывать несколько заказов на возврат для одного и того же заказа. После подтверждения того, что один обработан, другой обрабатывается.
-
Статус возврата: вызов статуса стороннего интерфейса callStatus, статус результата возврата returnStatus. Статус callStatus выполнен успешно, а returnStatus не выполнен. Вы можете регулярно проверять статус возврата.
-
Запросить результат возврата: необязательно, в зависимости от ситуации со сторонним API.
-
Журналы: записываются как журналы запросов, так и журналы возвратов.
4. Примирение
Чтобы завершить сверку, третьей стороне необходимо предоставить данные об успешности платежа за предыдущий день, а затем сравнить их с данными об успешности платежа за день в системе платежного шлюза.
Типы несоответствий:
-
У платежных шлюзов есть данные, у третьих лиц нет данных
- Скорее всего взломали, пользователь толком не заплатил, но мы отправили
- Проблема с кодом, пользователь не завершил платеж, но система считает платеж успешным
- Неполные данные предоставлены третьими лицами
- Платежный шлюз не имеет данных, данные есть у третьей стороны
- Пользователь успешно платит, но синхронное или асинхронное уведомление не проходит
- Суммы не совпадают
- Проблема с кодом, и сумма платежа, инициированная компанией электронной коммерции, не соответствует сумме, фактически вызванной третьей стороной.
- Проблема с данными, предоставленными третьей стороной
Сверка является важной частью проверки правильности платежной системы.Это может помочь разработчикам найти много проблем сегодня утром.Рекомендуется, чтобы каждый способ оплаты поддерживался и согласовывался вовремя.
Пример
3. Предоплата
После завершения вышеуказанных четырех процессов осуществляется подключение платежных каналов. Затем необходимо рассмотреть реализацию платежного шлюза. Платежный шлюз включает несколько платежных каналов и обеспечивает единый интерфейс с внешним миром. Платежные шлюзы обычно должны учитывать следующие вопросы:
-
К платежному шлюзу подключено несколько сторонних платежей. Как спроектировать, чтобы минимизировать изменения?
-
Тот же банк, поддержка нескольких сторонних платежей, как спроектировать систему распределения трафика?
-
Как отслеживать успешность каждого стороннего платежа и динамически переключать сторонний платеж?
-
Как сделать хорошую работу по управлению рисками?
Объяснение этих вопросов занимает много места и будет объяснено в будущем. Вы можете сначала придумать некоторые решения для себя.
В конце концов
Если вам нравятся мои статьи, то можете обратить внимание на мой публичный номер (программист Малатанг)