@dg-elements/js-sdk 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +248 -0
- package/dist/dg-element.esm.js +785 -0
- package/dist/dg-element.esm.js.map +1 -0
- package/dist/dg-element.js +793 -0
- package/dist/dg-element.js.map +1 -0
- package/dist/dg-element.min.js +4 -0
- package/dist/dg-element.min.js.map +1 -0
- package/package.json +37 -0
package/README.md
ADDED
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
# 收银台 js sdk
|
|
2
|
+
## 简介
|
|
3
|
+
收银台 SDK,是基于支付托管模式,商户需开通支付托管功能。SDK 支持支付宝、微信、云闪付等多种支付方式。同时能根据需求高定制化的配置页面样式。封装收银台页面以及独立支付按钮等功能组件,通过 npm 包的形式分发和引入,帮助商户无感对接支付。降低商户接入支付的复杂性。
|
|
4
|
+
|
|
5
|
+
改变原有支付托管跳转页面的接入方式,只提供支付功能的组件或按钮,允许商户侧自己定制实现收银台页面。实现页面高定制化的需求。
|
|
6
|
+
|
|
7
|
+
开发者通过创建 'checkout' element 创建页面组件,然后将其渲染到页面上,同时传入 callback 方法用来接收处理事件结果。
|
|
8
|
+
|
|
9
|
+
* 默认包含支付宝,微信,云闪付三种支付方式。
|
|
10
|
+
|
|
11
|
+
* 根据环境展示支付方式,支付宝内只展示支付宝,微信内只展示微信,云闪付只展示云闪付。系统默认浏览器展示支付宝与微信。
|
|
12
|
+
|
|
13
|
+
**H5页面效果图**
|
|
14
|
+
|
|
15
|
+

|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
**PC页面效果图**
|
|
19
|
+
|
|
20
|
+

|
|
21
|
+
|
|
22
|
+
## 流程说明
|
|
23
|
+
|
|
24
|
+

|
|
25
|
+
|
|
26
|
+
* 如果是 ATU App 内浏览器访问页面。
|
|
27
|
+
* 如果是微信 app,跳转授权页面,获取 authcode 下单。发起支付。(微信内走公众号支付流程,结果页)
|
|
28
|
+
* 如果是支付宝 app,下单 A_native 正扫 方式,拉起,支付。
|
|
29
|
+
* 如果是云闪付,跳转授权页面,获取 authcode,点击支付按钮,下单,发起支付。
|
|
30
|
+
* 如果是手机系统自带浏览器,
|
|
31
|
+
* 选择微信支付,跳转微信托管小程序,完成支付。H5 页面轮询获取支付结果,返回支付结果给调用方。
|
|
32
|
+
* 选择支付宝支付,跳转支付宝,下单 A_native 正扫 方式,拉起,支付。H5 页面轮询获取支付结果,返回支付结果给调用方。
|
|
33
|
+
* 不支持云闪付。
|
|
34
|
+
* 如果是PC 端浏览器,展示支付方式对应的支付二维码,用户扫描二维码完成支付。支付逻辑同手机端相同。
|
|
35
|
+
|
|
36
|
+
## 接入说明
|
|
37
|
+
|
|
38
|
+
### 服务端对接
|
|
39
|
+
支付sdk是基于支付托管模式的,商户需开通支付托管功能,并且商户服务端需对接预下单接口,并提供前端接口给前端调用。
|
|
40
|
+
接口文档参见 [预下单接口](!https://paas.huifu.com/open/doc/api/#/cpjs/api_cpjs_hosting)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
(注意:H5/PC页面预下单选择要根据环境判断,如果是ATU app内预下单pre_order_type = 1;
|
|
45
|
+
如果是在商户自己App,或者是系统默认浏览器里面是通过跳转小程序的方式完成支付的,所以如果在非ATU环境下,选择微信的话 pre_order_type=3,选支付宝 预下单 pre_order_type= 2)
|
|
46
|
+
|
|
47
|
+
### 前端对接准备
|
|
48
|
+
#### 1,远程下载并安装sdk
|
|
49
|
+
```
|
|
50
|
+
npm install @dg-elements/js-sdk
|
|
51
|
+
```
|
|
52
|
+
或下载sdk 包
|
|
53
|
+
[1.0.0](!https://cdn.cloudpnr.com/opps/api/test/partners/devtools/doc/dg-element.min.js)
|
|
54
|
+
|
|
55
|
+
#### 2,引入sdk
|
|
56
|
+
```
|
|
57
|
+
import { HFPay } from '@dg-elements/js-sdk';
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
#### 3,判断环境
|
|
61
|
+
|
|
62
|
+
如渲染单一支付按钮组件,需先判断当前环境是否支持
|
|
63
|
+
```
|
|
64
|
+
/**
|
|
65
|
+
* @Description: 判断是否是微信浏览器
|
|
66
|
+
*/
|
|
67
|
+
function isWXJS() {
|
|
68
|
+
return navigator && navigator.userAgent.toLowerCase().indexOf('micromessenger') > 0;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* @Description: 判断是否是支付宝浏览器
|
|
73
|
+
*/
|
|
74
|
+
function isAliPayJS() {
|
|
75
|
+
return navigator && navigator.userAgent.toLowerCase().indexOf('alipayclient') > 0;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* @Description: 判断是否是银联浏览器
|
|
80
|
+
*/
|
|
81
|
+
function isUnionPayJS() {
|
|
82
|
+
return navigator && navigator.userAgent.toLowerCase().indexOf('unionpay') > 0;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* @Description: 判断是否是web环境
|
|
87
|
+
*/
|
|
88
|
+
function isWebEnv() {
|
|
89
|
+
return !/Android|webOS|iPhone|iPod|Phone|Mobile|OpenHarmony|BlackBerry/i.test(navigator.userAgent);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
#### 4,定义预下单方法
|
|
95
|
+
|
|
96
|
+
通过服务端接口获取预下单号,定义方法,供后续传入sdk,sdk 内会调用该方法获取预下单号。
|
|
97
|
+
以下为代码示例,具体调用以商户侧为准,但返回数据格式需与示例一致。需包含 pre_order_id、huifu_id、req_seq_id、req_date
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
const createPreOrder = async function (selectedType) {
|
|
101
|
+
// 增加loading 弹框
|
|
102
|
+
document.getElementById('loadingMask').classList.remove('hide');
|
|
103
|
+
const requestBody = {
|
|
104
|
+
huifu_id: '6666000109133323',
|
|
105
|
+
req_seq_id: Date.now().toString(),
|
|
106
|
+
trans_amt: document.getElementById('element-amount').value,
|
|
107
|
+
time_expire: '300',
|
|
108
|
+
pre_order_type: '1',
|
|
109
|
+
goods_desc: '无线鼠标静音无声笔记本台式电脑',
|
|
110
|
+
hosting_data: {
|
|
111
|
+
project_title: 'DEMO演示-无模板',
|
|
112
|
+
project_id: 'PROJECTID2023092518673961',
|
|
113
|
+
callback_url: 'http://paas.huifutest.com/checkout/demo/h5/jsSDKDemo.html',
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
if (isAliPayJS() || isWXJS() || isUnionPayJS() ) {
|
|
118
|
+
|
|
119
|
+
requestBody.pre_order_type = '1';
|
|
120
|
+
} else if (selectedType === 'alipay') {
|
|
121
|
+
requestBody.pre_order_type = '2';
|
|
122
|
+
requestBody.app_data = {
|
|
123
|
+
app_schema: 'app_schema',
|
|
124
|
+
}
|
|
125
|
+
} else if (selectedType === 'wechatpay') {
|
|
126
|
+
requestBody.pre_order_type = '3';
|
|
127
|
+
requestBody.miniapp_data = {
|
|
128
|
+
need_scheme: 'Y',
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
try {
|
|
133
|
+
const response = await fetch(`https://checkoutbff.cloudpnr.com/v1/payment/pre/create`, {
|
|
134
|
+
method: 'POST',
|
|
135
|
+
headers: {
|
|
136
|
+
'Content-Type': 'application/json', // 建議加上 Header
|
|
137
|
+
},
|
|
138
|
+
body: JSON.stringify(requestBody),
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
const data = await response.json();
|
|
142
|
+
console.log('預下单结果:', data);
|
|
143
|
+
// 隐藏loading 弹框
|
|
144
|
+
document.getElementById('loadingMask').classList.add('hide');
|
|
145
|
+
loadingFlag = false;
|
|
146
|
+
return {
|
|
147
|
+
pre_order_id: data.json_data.pre_order_id,
|
|
148
|
+
req_seq_id: data.json_data.req_seq_id,
|
|
149
|
+
huifu_id: data.json_data.huifu_id,
|
|
150
|
+
req_date: data.json_data.req_date,
|
|
151
|
+
};
|
|
152
|
+
} catch (err) {
|
|
153
|
+
// 隐藏loading 弹框
|
|
154
|
+
$('#loadingMask').hide();
|
|
155
|
+
console.error('預下單失敗:', err);
|
|
156
|
+
// 將錯誤向上拋出,讓調用者也能處理
|
|
157
|
+
throw err;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
#### 5,创建收银台 element,将组件渲染到页面上
|
|
163
|
+
|
|
164
|
+
* 方法调用
|
|
165
|
+
```
|
|
166
|
+
const { error, hfPay } = await HFPay();
|
|
167
|
+
hfPay.component(elementName,{
|
|
168
|
+
createPreOrder: createPreOrder,
|
|
169
|
+
callback:callback
|
|
170
|
+
});
|
|
171
|
+
```
|
|
172
|
+
* 参数说明
|
|
173
|
+
|参数 | 类型 |说明 |
|
|
174
|
+
|:--------|:------------|:-------------|
|
|
175
|
+
| elementName | 字符串 | element 类型,checkout|
|
|
176
|
+
| createPreOrder | function | 创建预下单的方法,需返回预下单号,具体参见调用示例|
|
|
177
|
+
| callback | function | 回调方法,一般处理报错信息|
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
调用示例:
|
|
182
|
+
|
|
183
|
+
```
|
|
184
|
+
function callback(result) {
|
|
185
|
+
console.log('callback 返回' + JSON.stringify(result));
|
|
186
|
+
// {"type":"payment_data","data":{"transStat":"1","huifuId":"6666000109133323","reqSeqId":"1753150933645","reqDate":"20250722","respDesc":"操作成功"}}
|
|
187
|
+
}
|
|
188
|
+
let element = hfPay.component('checkout',
|
|
189
|
+
{
|
|
190
|
+
createPreOrder: createPreOrder,
|
|
191
|
+
callback:callback
|
|
192
|
+
});
|
|
193
|
+
if (element) {
|
|
194
|
+
element.mount('#element-container');
|
|
195
|
+
} else {
|
|
196
|
+
console.log(`App: SDK 未能創建組件`);
|
|
197
|
+
}
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
#### 6,创建单支付按钮 element,将组件渲染到页面上
|
|
201
|
+
|
|
202
|
+
除了创建整个checkout组件,还可以创建单支付按钮组件,支持支付宝、微信、云闪付三种支付方式
|
|
203
|
+
|
|
204
|
+
* 方法调用
|
|
205
|
+
```
|
|
206
|
+
const { error, hfPay } = await HFPay();
|
|
207
|
+
hfPay.component(type, {
|
|
208
|
+
createPreOrder: createPreOrder,
|
|
209
|
+
callback:callback
|
|
210
|
+
});
|
|
211
|
+
```
|
|
212
|
+
* 参数说明
|
|
213
|
+
|参数 | 类型 |说明 |
|
|
214
|
+
|:--------|:------------|:-------------|
|
|
215
|
+
| elementypetName | 字符串 | 单支付按钮类型,枚举值,alipay、wechatpay、unionpay|
|
|
216
|
+
| createPreOrder | function | 创建预下单的方法,需返回预下单号,具体参见调用示例|
|
|
217
|
+
| callback | function | 回调方法,一般处理报错信息|
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
#### 7,处理回调
|
|
221
|
+
|
|
222
|
+
```
|
|
223
|
+
{
|
|
224
|
+
"type":"payment_data",
|
|
225
|
+
"data":{
|
|
226
|
+
"transStat":"1",
|
|
227
|
+
"huifuId":"6666000109133323",
|
|
228
|
+
"reqSeqId":"1753150933645",
|
|
229
|
+
"reqDate":"20250722",
|
|
230
|
+
"respDesc":"操作成功"
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
```
|
|
234
|
+
### 常见问题
|
|
235
|
+
|
|
236
|
+
Q1:如何给支付按钮定制样式
|
|
237
|
+
|
|
238
|
+
A:可直接通过按钮class name 进行css 样式定制
|
|
239
|
+
|
|
240
|
+
Q2:微信支付宝是怎么实现支付的
|
|
241
|
+
|
|
242
|
+
A:如果在ATU 环境中,点击支付,页面会跳转到支付页面。如果在非ATU 环境中,点击支付,会拉起小程序进行后续支付操作。
|
|
243
|
+
|
|
244
|
+
## SDK版本记录
|
|
245
|
+
|
|
246
|
+
|<div style="width: 35pt">版本</div> | <div style="width: 60pt">日期</div> | 版本说明 |
|
|
247
|
+
|:--------|:------------|:-------------|
|
|
248
|
+
| v1.0.0 | 2025/8/28 | 初始版本,支持微信支付宝云闪付支付 |
|