[Сводка по 3 типам] В проекте vue [H5] как обработать форму Alipay, возвращенную бэкендом, и как реализовать скачок платежа?

Предыстория: Все текущие проекты требуют оплаты, что неизбежно связано с платежами через Alipay или WeChat. Если это платеж Alipay, многие говорят, что это был 2202, и Alipay по-прежнему возвращает форму формы , а затем вызывает интерфейс Alipay.
    Вообще говоря, Alipay делится на два типа: платеж, инициируемый внешним интерфейсом, и платеж, инициируемый фоном:
① Платеж, инициируемый внешним интерфейсом, сначала отправляет данные заказа в фоновый режим для создания заказа. Затем внешний интерфейс вызывает платеж мобильного телефона для осуществления платежа;
②Если метод инициирования платежа в фоновом режиме принят, возврат представляет собой html-структуру формы <form >< /form>, которая содержит <script> написано в теге Listen to the submit button event</script>;
проще говоря, платеж, инициированный фоном, вернет форму формы, а метод отправки в форме будет вызываться для вызова интерфейса Alipay.

1. Идеи реализации

    Прежде всего, уточним бизнес-логику, должен быть процесс отправки информации о заказе [post] до скачка оплаты, а вся наша платежная форма возвращает результат после [post]. Возвращаемый строковый результат выглядит следующим образом:
вставьте сюда описание изображения

вставьте сюда описание изображения
Чтобы разобраться, весь процесс оплаты (этот процесс только для бизнеса компании, только для справки):
①Сгенерировать токен, createToken;
②Создать заказ createOrder, сгенерировать orderCoder (пс: вам нужно использовать его позже, чтобы получить детали заказа);
③H5 вызывается через почтовый интерфейс и возвращает форму формы (большинство случаев в Интернете относятся к этому шагу);
④H5 и шаг ③ инициируются одновременно, чтобы получить детали заказа, опросить результат платежа и, наконец, вернуть результат успешного или неудачного платежа (ps: в этом процессе фоновый вызов вызывает интерфейс и не может получить обратный вызов после платежа.В настоящее время опрос используется для вызова фонового платежа интерфейса к состоянию).

2. Связанные коды

Интерфейсный код:
2.1 方法一:使用document.forms[0].submit(),提交表单操作
(1) Сначала поместите содержимое формы на страницу:

<div class="aliform" v-html="aliform"></div>

(2) Получите первое представление формы текущей страницы через document.forms[0].submit():

<script>
export default {
    
    
	data() {
    
    
	    return {
    
    
	      aliform: "",
	    };
  	},
  	methods: {
    
    
		async iosAlipay(orderCode) {
    
    
      		let data = await requestAlipay(orderCode);
      		if (data.code == 20000) {
    
    
        		this.aliform = data.data;  //data.data就是支付宝返回给你的form,获取到的表单内容,具体样子可见上面的图片
        		this.$nextTick(() => {
    
    
        			// 获取订单详情来轮询支付结果
          			this.getOrderDetail();  
          			console.log(document.forms);  //跳转之前,可以先打印看看forms,确保后台数据和forms正确,否则,可能会出现一些奇奇怪怪的问题 ╮(╯▽╰)╭
          			document.forms[0].submit();  //重点--这个才是跳转页面的核心,获取第一个表单并提交
        		});
      		}
    	},
    	// 轮询结果
	    getOrderDetail() {
    
    
	    //轮询方法,因为支付是跳转到第三方支付宝,我们无法获知用户是否支付成功,或者用户支付成功后是否跳转回来。轮询方法,在一定时间内
	      clearTimeout(this.timer);
	      this.timer = setTimeout(() => {
    
    
	        let initTime = +new Date();
	        let loop = () => {
    
    
	          getOrderDetail({
    
     orderCode: this.orderCode}).then((res) => {
    
    
	            if (res.code == 20000 && res.data && res.data.payStatus == 30) {
    
    
	              //支付成功的相关操作
	            } else {
    
    
	              let now = +new Date();
	              if (now - initTime < 45000) {
    
    
	                loop();
	              } else {
    
    
	                // 超时按照失败处理
	                //支付失败的结果
	              }
	            }
	          });
	        };
	        loop();
	      }, 500);
	    },
	}
}
</script>
<style lang="less" scoped >
.aliform {
    
    
  width: 1px;
  height: 1px;
  opacity: 0;
}
</style>

(3) Отступление — взгляните на метод document.forms, предоставляемый js:

(1)document.forms //表示获取当前页面的所有表单;
(2)document.forms[0] //表示获取当前页面的第一个表单;
(3)document.forms['exportServlet'] //表示获取当前页面的name="exportServlet"的表单
(4)submit() //表示提交函数

2.2 方法二:使用document.write(),就是重定向,覆盖原始页面

\\ 假设result是后端返回的from字符串
const newWindow = window.open('', '_self');  
newWindow.document.write(result);
newWindow.focus();

или,直接使用document.write(xxx),来进行支付跳转

await postUserinfo('接口入参').then(res=>{
    
    
	document.write(res.data.result)
})

Если он обрабатывается на стороне ПК, с этим методом проблем нет, но необходимо обратить внимание на три момента:
①window.open() срабатывает в обратном вызове интерфейса, что может быть перехвачено браузером;
②Если адрес самой страницы https, а действие возвращаемой формы – http, то браузер также выведет запрос безопасности ③ Окно среды WeChat .open() не
действует.
2.3 方法三:动态创建div容器,将form渲染进去,js触发form提交
Несмотря на то, что за пределами формы, возвращаемой в результат, находится html-пакет, можно динамически создать контейнер div, и тогда результат, содержащий <html>, будет отрендерен в него, а отправка формы формы будет инициирована через js.

const div = document.createElement('formdiv');
div.innerHTML = result;
document.body.appendChild(div);
document.forms['cashierSubmit'].setAttribute('target', '_self');
document.forms['cashierSubmit'].submit();
div.remove();

Для H5 это решение более совместимо.нужно знать, это:
Вначале установка цели формы на _blank делала невозможным отправку формы браузерами на ios (среда WeChat, Safari, UC). После смены на _self проблема решена.

В качестве альтернативы это также работает:

let divForm = document.getElementsByTagName('divform')
if (divForm.length) {
    
    
    document.body.removeChild(divForm[0])
}
const div = document.createElement('divform')
div.innerHTML = res.data // res.data就是支付宝返回给你的form
document.body.appendChild(div)
// document.forms[0].setAttribute('target', '_blank') // 加了_blank可能出问题所以我注释了
document.getElementById('alipay_submit').submit()

Или попробуйте следующее:

 //将接口返回的Form表单显示到页面
 document.querySelector('body').innerHTML = res.data; // res.data就是支付宝返回给你的form
 //调用submit 方法
 document.forms[0].submit()

Справочный блог:

UNI-APP анализирует форму FORM, возвращаемую Alipay, и вызывает интерфейс Alipay https://www.freesion.com/article/6241970398/
Vue прекрасно решает проблему формы, возвращаемую Alipay, что может быть наиболее эффективным решением https:// blog .zixutech.cn/archives/324
Форма Alipay, возвращенная бэкэндом в проекте vue, как реализовать скачок оплаты? https://blog.csdn.net/qq_45934004/article/details/126156546
После того, как Vue автоматически отправит форму формы, он автоматически перейдет на стороннюю страницу https://www.jianshu.com/p/e2323b4e2cf9
Заметки о разработке форма возврата платежа uniapp Alipay форма решение http://blog.haiya360.com/archives/766.html
vue URL возврата Alipay новое окно открыть https://blog.csdn.net/wax9092/article/details/86631151
H5 обработка интерфейс Alipay Форма возврата https://www.jianshu.com/p/8c5375671495
Форма Alipay, возвращенная бэкэндом в проекте vue, как реализовать скачок оплаты? https://blog.csdn.net/qq_45934004/article/details/126156546
Vue отлично решает проблему формы, возвращаемой Alipay, что может быть наиболее эффективным решением https://blog.zixutech.cn/archives/324

Guess you like

Origin blog.csdn.net/qq_26780317/article/details/126605149