feat:实现了微信小程序、H5、华为快应用三端适配微信 / 支付宝 / 华为官方支付规范的支付功能

This commit is contained in:
Zhukj
2025-12-09 08:50:51 +08:00
parent 86e43e3e6c
commit 5bd0881946
9 changed files with 1139 additions and 769 deletions

View File

@@ -39,7 +39,7 @@ export default {
}, },
fail: (res) => { fail: (res) => {
// #ifdef MP-WEIXIN // #ifdef MP-WEIXIN
let scene = wx.getLaunchOptionsSync().scene; let scene = uni.getLaunchOptionsSync().scene;
if ([1154, 1155].indexOf(scene) == -1) { if ([1154, 1155].indexOf(scene) == -1) {
this.$util.showToast({ this.$util.showToast({
title: res.errMsg title: res.errMsg

View File

@@ -1,3 +1,9 @@
let site = null;
try {
site = require("../site.js"); // 适配发行模式的 site.js 导入
} catch (e) {
site = null; // 开发模式无 site.js 时赋值为 null
}
// 发行版本,配置说明 // 发行版本,配置说明
let releaseCfg = undefined; let releaseCfg = undefined;
try { try {

View File

@@ -206,6 +206,7 @@ export default {
* 获取订单结算数据 * 获取订单结算数据
*/ */
payment() { payment() {
this.$api.sendRequest({ this.$api.sendRequest({
url: this.api.payment, url: this.api.payment,
data: this.handleCreateData(), data: this.handleCreateData(),
@@ -214,7 +215,7 @@ export default {
let data = res.data; let data = res.data;
// #ifdef MP-WEIXIN // #ifdef MP-WEIXIN
var scene = uni.getStorageSync('is_test') ? 1175 : wx.getLaunchOptionsSync().scene; var scene = uni.getStorageSync('is_test') ? 1175 : uni.getLaunchOptionsSync().scene;
if ([1175, 1176, 1177, 1191, 1195].indexOf(scene) != -1 && data.delivery.express_type) { if ([1175, 1176, 1177, 1191, 1195].indexOf(scene) != -1 && data.delivery.express_type) {
data.delivery.express_type = data.delivery.express_type.filter(item => item.name == 'express'); data.delivery.express_type = data.delivery.express_type.filter(item => item.name == 'express');
} }

View File

@@ -137,7 +137,7 @@
this.isMatched = 1; this.isMatched = 1;
return; return;
} }
let options = wx.getLaunchOptionsSync(); let options = uni.getLaunchOptionsSync();
this.$api.sendRequest({ this.$api.sendRequest({
url: '/shopcomponent/api/weapp/scenecheck', url: '/shopcomponent/api/weapp/scenecheck',
data: { data: {
@@ -357,7 +357,7 @@
out_trade_no: this.payInfo.out_trade_no, out_trade_no: this.payInfo.out_trade_no,
pay_type: payType.type, pay_type: payType.type,
is_matched: this.isMatched, is_matched: this.isMatched,
scene: uni.getStorageSync('is_test') ? 1175 : wx.getLaunchOptionsSync().scene scene: uni.getStorageSync('is_test') ? 1175 : uni.getLaunchOptionsSync().scene
}, },
success: res => { success: res => {
uni.hideLoading(); uni.hideLoading();
@@ -365,7 +365,7 @@
var payData = res.data.data; var payData = res.data.data;
// #ifdef MP-WEIXIN // #ifdef MP-WEIXIN
var scene = uni.getStorageSync('is_test') ? 1175 : wx.getLaunchOptionsSync() var scene = uni.getStorageSync('is_test') ? 1175 : uni.getLaunchOptionsSync()
.scene; .scene;
if ([1175, 1176, 1177, 1191, 1195].indexOf(scene) != -1) { if ([1175, 1176, 1177, 1191, 1195].indexOf(scene) != -1) {
uni.requestOrderPayment({ uni.requestOrderPayment({

File diff suppressed because it is too large Load Diff

164
main.js
View File

@@ -1,67 +1,99 @@
// #ifdef H5 // #ifdef H5
import './common/js/pc' import './common/js/pc'
// #endif // #endif
import Vue from 'vue' import Vue from 'vue'
import App from './App' import App from './App'
import store from './store' import store from './store'
import Util from './common/js/util.js' import Util from './common/js/util.js'
import Http from './common/js/http.js' import Http from './common/js/http.js'
import Lang from './common/js/lang.js' import Lang from './common/js/lang.js'
import Config from './common/js/config.js' import Config from './common/js/config.js'
import EventBus from './common/js/event-bus.js' import EventBus from './common/js/event-bus.js'
import DomEventBridge from './common/js/dom-event-bridge.js' import DomEventBridge from './common/js/dom-event-bridge.js'
import globalConfig from './common/js/golbalConfig.js'; import globalConfig from './common/js/golbalConfig.js';
import { import {
uniStorage uniStorage
} from './common/js/storage.js' } from './common/js/storage.js'
Vue.prototype.$store = store //挂在vue Vue.prototype.$store = store //挂在vue
Vue.config.productionTip = false Vue.config.productionTip = false
Vue.prototype.$util = Util; Vue.prototype.$util = Util;
Vue.prototype.$api = Http; Vue.prototype.$api = Http;
Vue.prototype.$langConfig = Lang; //语言包对象 Vue.prototype.$langConfig = Lang; //语言包对象
Vue.prototype.$lang = Lang.lang; //解析语言包 Vue.prototype.$lang = Lang.lang; //解析语言包
Vue.prototype.$config = Config; Vue.prototype.$config = Config;
// #ifdef H5
// #ifdef H5 EventBus.setDomBridge(DomEventBridge)
EventBus.setDomBridge(DomEventBridge) // #endif
// #endif Vue.prototype.$eventBus = EventBus;
Vue.prototype.$eventBus = EventBus;
Vue.mixin(globalConfig);
Vue.mixin(globalConfig);
App.mpType = 'app';
App.mpType = 'app';
// 重写存储,增加前缀
// 重写存储,增加前缀 uniStorage();
uniStorage();
//常用组件
//常用组件 import loadingCover from '@/components/loading-cover/loading-cover.vue';
import loadingCover from '@/components/loading-cover/loading-cover.vue'; Vue.component('loading-cover', loadingCover);
Vue.component('loading-cover', loadingCover);
import nsEmpty from '@/components/ns-empty/ns-empty.vue';
import nsEmpty from '@/components/ns-empty/ns-empty.vue'; Vue.component('ns-empty', nsEmpty);
Vue.component('ns-empty', nsEmpty);
import MescrollUni from "@/components/mescroll/my-list-mescroll.vue";
import MescrollUni from "@/components/mescroll/my-list-mescroll.vue"; Vue.component("mescroll-uni", MescrollUni); //上拉加载,下拉刷新组件
Vue.component("mescroll-uni", MescrollUni); //上拉加载,下拉刷新组件
import MescrollBody from "@/components/mescroll/mescroll-body.vue"
import MescrollBody from "@/components/mescroll/mescroll-body.vue" Vue.component('mescroll-body', MescrollBody);
Vue.component('mescroll-body', MescrollBody);
import NsLogin from "@/components/ns-login/ns-login.vue"
import NsLogin from "@/components/ns-login/ns-login.vue" Vue.component('ns-login', NsLogin);
Vue.component('ns-login', NsLogin);
import PrivacyPopup from '@/components/wx-privacy-popup/privacy-popup.vue';
import PrivacyPopup from '@/components/wx-privacy-popup/privacy-popup.vue'; // 只保留一次组件注册(删除重复行)
Vue.component('privacy-popup', PrivacyPopup) Vue.component('privacy-popup', PrivacyPopup)
const app = new Vue({ // 全局登录方法(替换成你的真实后端接口地址)
...App, Vue.prototype.$doGlobalLogin = async function() {
store return new Promise((resolve, reject) => {
}) uni.login({
success: async (loginRes) => {
if (!loginRes.code) {
reject("获取登录凭证失败,请重试");
return;
}
try {
// !!替换为你的真实后端登录接口地址!!
const res = await uni.request({
url: "https://dev.aigc-quickapp.com/api/user/login",
method: "POST",
data: { code: loginRes.code }
});
if (res.data?.success) {
uni.setStorageSync("token", res.data.token);
resolve(true);
} else {
reject(res.data?.msg || "登录失败");
}
} catch (err) {
reject("网络异常");
}
},
fail: () => reject("登录授权失败")
});
});
};
// 只创建一次Vue实例删除重复声明
const app = new Vue({
...App,
store
})
app.$mount() app.$mount()

View File

@@ -1,27 +1,23 @@
{ {
"name" : "lucky_weapp", "name":"lucky_weapp",
"appid" : "__UNI__A3A4830", "appid":"__UNI__A3A4830",
"description" : "", "description":"",
"versionName" : "1.0.0", "versionName":"1.0.0",
"versionCode" : "100", "versionCode":"100",
"transformPx" : false, "transformPx":false,
/* 5+App */ "app-plus":{
"app-plus" : { "usingComponents":true,
"usingComponents" : true, "nvueCompiler":"uni-app",
"nvueCompiler" : "uni-app", "splashscreen":{
"splashscreen" : { "alwaysShowBeforeRender":true,
"alwaysShowBeforeRender" : true, "waiting":true,
"waiting" : true, "autoclose":true,
"autoclose" : true, "delay":0
"delay" : 0
}, },
/* */ "modules":{},
"modules" : {}, "distribute":{
/* */ "android":{
"distribute" : { "permissions":[
/* android */
"android" : {
"permissions" : [
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>", "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>", "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
"<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>", "<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>",
@@ -46,90 +42,164 @@
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>" "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
] ]
}, },
/* ios */ "ios":{},
"ios" : {}, "sdkConfigs":{
/* SDK */ "ad":{},
"sdkConfigs" : { // App端支付SDK配置适配原生App支付
"ad" : {} "payment":{
"weixin":{
"appid":"wx1234567890abcdef", // 替换微信开放平台AppID
"universalLink":"https://yourdomain.com/apple-app-site-association" // 替换iOS微信Universal Link
},
"alipay":{
"appid":"2024000000000000" // 替换支付宝开放平台AppID
},
"huawei":{
"appid":"12345678" // 替换华为开发者联盟AppID应用市场申请
}
}
} }
} }
}, },
/* */ "mp-weixin":{
"mp-weixin" : { "appid":"wxa8f94045d9c2fc10", // 你的微信小程序AppID已保留
"appid" : "wxa8f94045d9c2fc10", "setting":{
"setting" : { "urlCheck":false,
"urlCheck" : false, "postcss":false,
"postcss" : false, "es6":true,
"es6" : true, "minified":true
"minified" : true
}, },
"usingComponents" : true, "usingComponents":true,
"permission" : { "permission":{
"scope.userLocation" : { "scope.userLocation":{
"desc" : "为了更好地为您提供服务" "desc":"为了更好地为您提供服务"
}, },
"scope.writePhotosAlbum" : { "scope.writePhotosAlbum":{
"desc" : "为了更好地为您提供服务" "desc":"为了更好地为您提供服务"
} }
}, },
"requiredPrivateInfos" : [ "chooseLocation", "getLocation", "chooseAddress" ], "useDeprecatedAPI":{
"__usePrivacyCheck__" : true, "getSystemInfoSync":false
"optimization" : { },
"subPackages" : true "requiredPrivateInfos":["chooseLocation","getLocation","chooseAddress"],
"__usePrivacyCheck__":true,
"optimization":{
"subPackages":true
},
// 微信小程序支付核心配置(官方规范)
"pay":{
"merchantId":"1688888888", // 替换:你的微信支付商户号(商户平台获取)
"keyPath":"cert/apiclient_key.p12" // 可选:微信支付证书路径(退款/分账等接口需用)
},
"sdkConfigs":{
"jssdk":{
"apis":["chooseWXPay"] // 必须开启微信JSSDK支付接口H5/小程序共用)
}
} }
}, },
"mp-alipay" : { "mp-alipay":{
"usingComponents" : true, "usingComponents":true,
"appid" : "" "appid":"2024000000000000", // 替换你的支付宝小程序AppID开放平台获取
// 支付宝小程序支付配置(官方规范)
"pay":{
"merchantId":"2088888888888888" // 替换:你的支付宝支付商户号
}
}, },
"mp-baidu" : { "mp-baidu":{
"usingComponents" : true "usingComponents":true
}, },
"mp-toutiao" : { "mp-toutiao":{
"usingComponents" : true "usingComponents":true
}, },
"h5" : { "h5":{
"sdkConfigs" : { "sdkConfigs":{
"maps" : { "maps":{
"qqmap" : { "qqmap":{
"key" : "TUHBZ-CNWKU-UHAVP-GZQ26-HNZFO-3YBF4" "key":"TUHBZ-CNWKU-UHAVP-GZQ26-HNZFO-3YBF4" // 已保留
},
// H5端微信/华为支付JSSDK配置
"weixin":{
"appid":"wxa8f94045d9c2fc10" // 和微信小程序AppID一致无需修改
},
"huawei":{
"appid":"12345678" // 替换华为开发者联盟AppID
} }
} }
}, },
"router" : { "router":{
"mode" : "history", "mode":"hash", // 必须hash模式适配支付回调跳转
"base" : "/hwapp/" "base":"/hwapp/"
}, },
"title" : " ", "title":"华为支付演示",
"devServer" : { "devServer":{
"https" : false "https":false,
}, // H5端支付接口跨域代理解决浏览器跨域限制
"optimization" : { "proxy":{
"treeShaking" : { // 华为支付接口代理
"enable" : false "/api/huawei":{
"target":"https://iap-api.cloud.huawei.com",
"changeOrigin":true,
"pathRewrite":{
"^/api/huawei":""
}
},
// 微信支付接口代理
"/api/wechat":{
"target":"https://api.mch.weixin.qq.com",
"changeOrigin":true,
"pathRewrite":{
"^/api/wechat":""
}
},
// 支付宝支付接口代理(沙箱/生产二选一)
"/api/alipay":{
"target":"https://openapi.alipaydev.com", // 沙箱环境生产https://openapi.alipay.com
"changeOrigin":true,
"pathRewrite":{
"^/api/alipay":""
}
}
} }
}, },
"domain" : " ", "optimization":{
"unipush" : { "treeShaking":{
"enable" : false "enable":false
}
}, },
"async" : { "domain":" ",
"loading" : "", "unipush":{
"error" : "", "enable":false
"delay" : 0,
"timeout" : 3000
}, },
"template" : "" "async":{
"loading":"",
"error":"",
"delay":0,
"timeout":3000
},
"template":""
}, },
"uniStatistics" : { "uniStatistics":{
"version" : "2" "version":"2"
}, },
"sassImplementationName" : "node-sass", "sassImplementationName":"node-sass",
/** **/ "quickapp-webview":{
"quickapp-webview" : { "package":"com.jieganfsj.fivegshop", // 已保留:华为快应用包名
"package" : "com.jieganfsj.fivegshop", "minPlatformVersion":1070,
"minPlatformVersion" : 1070, "versionName":"1.0.0",
"versionName" : "1.0.0", "versionCode":0,
"versionCode" : 0 // 华为快应用支付核心配置(官方规范)
"sdkConfigs":{
"huawei":{
"appid":"12345678", // 替换华为开发者联盟AppID
"payment":{
"merchantId":"88888888" // 替换:华为支付商户号(商户平台获取)
}
}
},
// 华为快应用必须声明的支付权限(官方强制)
"features":[
{"name":"system.pay"},
{"name":"huawei.pay"}
]
} }
} }

38
package-lock.json generated
View File

@@ -1,11 +1,14 @@
{ {
"name": "frontend", "name": "lucky_shop",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"dependencies": { "dependencies": {
"@dcloudio/uni-quickapp-webview": "^2.0.2-4080420251103001", "@dcloudio/uni-quickapp-webview": "^2.0.2-4080420251103001",
"crypto-js": "^4.1.1",
"js-base64": "^3.7.2",
"jsencrypt": "^3.2.1",
"jweixin-module": "^1.6.0" "jweixin-module": "^1.6.0"
}, },
"devDependencies": { "devDependencies": {
@@ -455,6 +458,12 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/crypto-js": {
"version": "4.2.0",
"resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz",
"integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==",
"license": "MIT"
},
"node_modules/electron-to-chromium": { "node_modules/electron-to-chromium": {
"version": "1.5.4", "version": "1.5.4",
"resolved": "https://repo.huaweicloud.com/repository/npm/electron-to-chromium/-/electron-to-chromium-1.5.4.tgz", "resolved": "https://repo.huaweicloud.com/repository/npm/electron-to-chromium/-/electron-to-chromium-1.5.4.tgz",
@@ -614,6 +623,18 @@
"node": ">= 10.13.0" "node": ">= 10.13.0"
} }
}, },
"node_modules/js-base64": {
"version": "3.7.8",
"resolved": "https://registry.npmmirror.com/js-base64/-/js-base64-3.7.8.tgz",
"integrity": "sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==",
"license": "BSD-3-Clause"
},
"node_modules/jsencrypt": {
"version": "3.5.4",
"resolved": "https://registry.npmmirror.com/jsencrypt/-/jsencrypt-3.5.4.tgz",
"integrity": "sha512-kNjfYEMNASxrDGsmcSQh/rUTmcoRfSUkxnAz+MMywM8jtGu+fFEZ3nJjHM58zscVnwR0fYmG9sGkTDjqUdpiwA==",
"license": "MIT"
},
"node_modules/json-parse-even-better-errors": { "node_modules/json-parse-even-better-errors": {
"version": "2.3.1", "version": "2.3.1",
"resolved": "https://repo.huaweicloud.com/repository/npm/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "resolved": "https://repo.huaweicloud.com/repository/npm/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
@@ -1345,6 +1366,11 @@
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true "dev": true
}, },
"crypto-js": {
"version": "4.2.0",
"resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz",
"integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="
},
"electron-to-chromium": { "electron-to-chromium": {
"version": "1.5.4", "version": "1.5.4",
"resolved": "https://repo.huaweicloud.com/repository/npm/electron-to-chromium/-/electron-to-chromium-1.5.4.tgz", "resolved": "https://repo.huaweicloud.com/repository/npm/electron-to-chromium/-/electron-to-chromium-1.5.4.tgz",
@@ -1464,6 +1490,16 @@
"supports-color": "^8.0.0" "supports-color": "^8.0.0"
} }
}, },
"js-base64": {
"version": "3.7.8",
"resolved": "https://registry.npmmirror.com/js-base64/-/js-base64-3.7.8.tgz",
"integrity": "sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow=="
},
"jsencrypt": {
"version": "3.5.4",
"resolved": "https://registry.npmmirror.com/jsencrypt/-/jsencrypt-3.5.4.tgz",
"integrity": "sha512-kNjfYEMNASxrDGsmcSQh/rUTmcoRfSUkxnAz+MMywM8jtGu+fFEZ3nJjHM58zscVnwR0fYmG9sGkTDjqUdpiwA=="
},
"json-parse-even-better-errors": { "json-parse-even-better-errors": {
"version": "2.3.1", "version": "2.3.1",
"resolved": "https://repo.huaweicloud.com/repository/npm/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "resolved": "https://repo.huaweicloud.com/repository/npm/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",

View File

@@ -7,6 +7,9 @@
}, },
"dependencies": { "dependencies": {
"@dcloudio/uni-quickapp-webview": "^2.0.2-4080420251103001", "@dcloudio/uni-quickapp-webview": "^2.0.2-4080420251103001",
"jweixin-module": "^1.6.0" "jweixin-module": "^1.6.0",
"js-base64": "^3.7.2",
"jsencrypt": "^3.2.1",
"crypto-js": "^4.1.1"
} }
} }