mirror of
https://github.com/yangjian102621/geekai.git
synced 2025-09-17 16:56:38 +08:00
wechat payment for mobile page is ready
This commit is contained in:
parent
e874178782
commit
4976b967e7
@ -8,6 +8,7 @@
|
|||||||
* 功能优化:移除PayJS支付渠道支持,PayJs已经关闭注册服务,请使用其他支付方式。
|
* 功能优化:移除PayJS支付渠道支持,PayJs已经关闭注册服务,请使用其他支付方式。
|
||||||
* 功能新增:新增GeeK易支付支付渠道,支持支付宝,微信支付,QQ钱包,京东支付,抖音支付,Paypal支付等支付方式
|
* 功能新增:新增GeeK易支付支付渠道,支持支付宝,微信支付,QQ钱包,京东支付,抖音支付,Paypal支付等支付方式
|
||||||
* Bug修复:修复注册页面 tab 组件没有自动选中问题 [#6](https://github.com/yangjian102621/geekai-plus/issues/6)
|
* Bug修复:修复注册页面 tab 组件没有自动选中问题 [#6](https://github.com/yangjian102621/geekai-plus/issues/6)
|
||||||
|
* 功能优化:Luma生成视频任务增加自动翻译功能
|
||||||
|
|
||||||
## v4.1.3
|
## v4.1.3
|
||||||
* 功能优化:重构用户登录模块,给所有的登录组件增加行为验证码功能,支持用户绑定手机,邮箱和微信
|
* 功能优化:重构用户登录模块,给所有的登录组件增加行为验证码功能,支持用户绑定手机,邮箱和微信
|
||||||
|
@ -58,7 +58,6 @@ type AlipayConfig struct {
|
|||||||
AlipayPublicKey string // 支付宝公钥文件路径
|
AlipayPublicKey string // 支付宝公钥文件路径
|
||||||
RootCert string // Root 秘钥路径
|
RootCert string // Root 秘钥路径
|
||||||
NotifyURL string // 异步通知地址
|
NotifyURL string // 异步通知地址
|
||||||
ReturnURL string // 同步回调地址
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type WechatPayConfig struct {
|
type WechatPayConfig struct {
|
||||||
@ -69,7 +68,6 @@ type WechatPayConfig struct {
|
|||||||
PrivateKey string // 用户私钥文件路径
|
PrivateKey string // 用户私钥文件路径
|
||||||
ApiV3Key string // API V3 秘钥
|
ApiV3Key string // API V3 秘钥
|
||||||
NotifyURL string // 异步通知地址
|
NotifyURL string // 异步通知地址
|
||||||
ReturnURL string // 同步回调地址
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type HuPiPayConfig struct { //虎皮椒第四方支付配置
|
type HuPiPayConfig struct { //虎皮椒第四方支付配置
|
||||||
@ -78,7 +76,6 @@ type HuPiPayConfig struct { //虎皮椒第四方支付配置
|
|||||||
AppSecret string // app 密钥
|
AppSecret string // app 密钥
|
||||||
ApiURL string // 支付网关
|
ApiURL string // 支付网关
|
||||||
NotifyURL string // 异步通知地址
|
NotifyURL string // 异步通知地址
|
||||||
ReturnURL string // 同步回调地址
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// GeekPayConfig GEEK支付配置
|
// GeekPayConfig GEEK支付配置
|
||||||
@ -88,7 +85,6 @@ type GeekPayConfig struct {
|
|||||||
PrivateKey string // 私钥
|
PrivateKey string // 私钥
|
||||||
ApiURL string // API 网关
|
ApiURL string // API 网关
|
||||||
NotifyURL string // 异步通知地址
|
NotifyURL string // 异步通知地址
|
||||||
ReturnURL string // 同步回调地址
|
|
||||||
Methods []string // 支付方式
|
Methods []string // 支付方式
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,3 +22,18 @@ type OrderRemark struct {
|
|||||||
Price float64 `json:"price"`
|
Price float64 `json:"price"`
|
||||||
Discount float64 `json:"discount"`
|
Discount float64 `json:"discount"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var PayMethods = map[string]string{
|
||||||
|
"alipay": "支付宝商号",
|
||||||
|
"wechat": "微信商号",
|
||||||
|
"hupi": "虎皮椒",
|
||||||
|
"geek": "易支付",
|
||||||
|
}
|
||||||
|
var PayNames = map[string]string{
|
||||||
|
"alipay": "支付宝",
|
||||||
|
"wxpay": "微信支付",
|
||||||
|
"qqpay": "QQ钱包",
|
||||||
|
"jdpay": "京东支付",
|
||||||
|
"douyin": "抖音支付",
|
||||||
|
"paypal": "PayPal支付",
|
||||||
|
}
|
||||||
|
@ -67,6 +67,16 @@ func (h *OrderHandler) List(c *gin.Context) {
|
|||||||
order.Id = item.Id
|
order.Id = item.Id
|
||||||
order.CreatedAt = item.CreatedAt.Unix()
|
order.CreatedAt = item.CreatedAt.Unix()
|
||||||
order.UpdatedAt = item.UpdatedAt.Unix()
|
order.UpdatedAt = item.UpdatedAt.Unix()
|
||||||
|
payMethod, ok := types.PayMethods[item.PayWay]
|
||||||
|
if !ok {
|
||||||
|
payMethod = item.PayWay
|
||||||
|
}
|
||||||
|
payName, ok := types.PayNames[item.PayType]
|
||||||
|
if !ok {
|
||||||
|
payName = item.PayWay
|
||||||
|
}
|
||||||
|
order.PayMethod = payMethod
|
||||||
|
order.PayName = payName
|
||||||
list = append(list, order)
|
list = append(list, order)
|
||||||
} else {
|
} else {
|
||||||
logger.Error(err)
|
logger.Error(err)
|
||||||
|
@ -48,6 +48,16 @@ func (h *OrderHandler) List(c *gin.Context) {
|
|||||||
order.Id = item.Id
|
order.Id = item.Id
|
||||||
order.CreatedAt = item.CreatedAt.Unix()
|
order.CreatedAt = item.CreatedAt.Unix()
|
||||||
order.UpdatedAt = item.UpdatedAt.Unix()
|
order.UpdatedAt = item.UpdatedAt.Unix()
|
||||||
|
payMethod, ok := types.PayMethods[item.PayWay]
|
||||||
|
if !ok {
|
||||||
|
payMethod = item.PayWay
|
||||||
|
}
|
||||||
|
payName, ok := types.PayNames[item.PayType]
|
||||||
|
if !ok {
|
||||||
|
payName = item.PayWay
|
||||||
|
}
|
||||||
|
order.PayMethod = payMethod
|
||||||
|
order.PayName = payName
|
||||||
list = append(list, order)
|
list = append(list, order)
|
||||||
} else {
|
} else {
|
||||||
logger.Error(err)
|
logger.Error(err)
|
||||||
|
@ -97,6 +97,76 @@ func (h *PaymentHandler) Pay(c *gin.Context) {
|
|||||||
resp.NotAuth(c)
|
resp.NotAuth(c)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
amount, _ := decimal.NewFromFloat(product.Price).Sub(decimal.NewFromFloat(product.Discount)).Float64()
|
||||||
|
var payURL string
|
||||||
|
if payWay == "alipay" { // 支付宝
|
||||||
|
returnURL := fmt.Sprintf("%s/payReturn", utils.GetBaseURL(h.App.Config.AlipayConfig.NotifyURL))
|
||||||
|
money := fmt.Sprintf("%.2f", amount)
|
||||||
|
payURL, err = h.alipayService.PayPC(payment.AlipayParams{
|
||||||
|
OutTradeNo: orderNo,
|
||||||
|
Subject: product.Name,
|
||||||
|
TotalFee: money,
|
||||||
|
ReturnURL: returnURL,
|
||||||
|
NotifyURL: h.App.Config.AlipayConfig.NotifyURL,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
resp.ERROR(c, "error with generate pay url: "+err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} else if payWay == "hupi" { // 虎皮椒支付
|
||||||
|
returnURL := fmt.Sprintf("%s/payReturn", utils.GetBaseURL(h.App.Config.HuPiPayConfig.NotifyURL))
|
||||||
|
r, err := h.huPiPayService.Pay(payment.HuPiPayParams{
|
||||||
|
Version: "1.1",
|
||||||
|
TradeOrderId: orderNo,
|
||||||
|
TotalFee: fmt.Sprintf("%f", amount),
|
||||||
|
Title: product.Name,
|
||||||
|
NotifyURL: h.App.Config.HuPiPayConfig.NotifyURL,
|
||||||
|
ReturnURL: returnURL,
|
||||||
|
WapName: "GeekAI助手",
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
resp.ERROR(c, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
payURL = r.URL
|
||||||
|
} else if payWay == "wechat" {
|
||||||
|
payURL, err = h.wechatPayService.PayUrlNative(payment.WechatPayParams{
|
||||||
|
OutTradeNo: orderNo,
|
||||||
|
TotalFee: int(amount * 100),
|
||||||
|
Subject: product.Name,
|
||||||
|
NotifyURL: h.App.Config.WechatPayConfig.NotifyURL,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
resp.ERROR(c, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} else if payWay == "geek" {
|
||||||
|
returnURL := fmt.Sprintf("%s/payReturn", utils.GetBaseURL(h.App.Config.GeekPayConfig.NotifyURL))
|
||||||
|
if device == "wechat" {
|
||||||
|
returnURL = fmt.Sprintf("%s/mobile/profile", utils.GetBaseURL(h.App.Config.GeekPayConfig.NotifyURL))
|
||||||
|
}
|
||||||
|
params := payment.GeekPayParams{
|
||||||
|
OutTradeNo: orderNo,
|
||||||
|
Method: "web",
|
||||||
|
Name: product.Name,
|
||||||
|
Money: fmt.Sprintf("%f", amount),
|
||||||
|
ClientIP: c.ClientIP(),
|
||||||
|
Device: device,
|
||||||
|
Type: payType,
|
||||||
|
ReturnURL: returnURL,
|
||||||
|
NotifyURL: h.App.Config.GeekPayConfig.NotifyURL,
|
||||||
|
}
|
||||||
|
|
||||||
|
res, err := h.geekPayService.Pay(params)
|
||||||
|
if err != nil {
|
||||||
|
resp.ERROR(c, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
payURL = res.PayURL
|
||||||
|
}
|
||||||
|
|
||||||
// 创建订单
|
// 创建订单
|
||||||
remark := types.OrderRemark{
|
remark := types.OrderRemark{
|
||||||
Days: product.Days,
|
Days: product.Days,
|
||||||
@ -105,9 +175,6 @@ func (h *PaymentHandler) Pay(c *gin.Context) {
|
|||||||
Price: product.Price,
|
Price: product.Price,
|
||||||
Discount: product.Discount,
|
Discount: product.Discount,
|
||||||
}
|
}
|
||||||
|
|
||||||
amount, _ := decimal.NewFromFloat(product.Price).Sub(decimal.NewFromFloat(product.Discount)).Float64()
|
|
||||||
|
|
||||||
order := model.Order{
|
order := model.Order{
|
||||||
UserId: user.Id,
|
UserId: user.Id,
|
||||||
Username: user.Username,
|
Username: user.Username,
|
||||||
@ -125,78 +192,6 @@ func (h *PaymentHandler) Pay(c *gin.Context) {
|
|||||||
resp.ERROR(c, "error with create order: "+err.Error())
|
resp.ERROR(c, "error with create order: "+err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
var payURL string
|
|
||||||
if payWay == "alipay" { // 支付宝
|
|
||||||
money := fmt.Sprintf("%.2f", order.Amount)
|
|
||||||
if device == "mobile" {
|
|
||||||
payURL, err = h.alipayService.PayMobile(payment.AlipayParams{
|
|
||||||
OutTradeNo: orderNo,
|
|
||||||
Subject: product.Name,
|
|
||||||
TotalFee: money,
|
|
||||||
NotifyURL: h.App.Config.AlipayConfig.NotifyURL,
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
payURL, err = h.alipayService.PayPC(payment.AlipayParams{
|
|
||||||
OutTradeNo: orderNo,
|
|
||||||
Subject: product.Name,
|
|
||||||
TotalFee: money,
|
|
||||||
ReturnURL: h.App.Config.AlipayConfig.ReturnURL,
|
|
||||||
NotifyURL: h.App.Config.AlipayConfig.NotifyURL,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
resp.ERROR(c, "error with generate pay url: "+err.Error())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
} else if order.PayWay == "hupi" { // 虎皮椒支付
|
|
||||||
r, err := h.huPiPayService.Pay(payment.HuPiPayParams{
|
|
||||||
Version: "1.1",
|
|
||||||
TradeOrderId: orderNo,
|
|
||||||
TotalFee: fmt.Sprintf("%f", order.Amount),
|
|
||||||
Title: order.Subject,
|
|
||||||
NotifyURL: h.App.Config.HuPiPayConfig.NotifyURL,
|
|
||||||
ReturnURL: h.App.Config.HuPiPayConfig.ReturnURL,
|
|
||||||
WapName: "GeekAI助手",
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
resp.ERROR(c, err.Error())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
payURL = r.URL
|
|
||||||
} else if order.PayWay == "wechat" {
|
|
||||||
payURL, err = h.wechatPayService.PayUrlNative(payment.WechatPayParams{
|
|
||||||
OutTradeNo: orderNo,
|
|
||||||
TotalFee: int(order.Amount * 100),
|
|
||||||
Subject: order.Subject,
|
|
||||||
NotifyURL: h.App.Config.WechatPayConfig.NotifyURL,
|
|
||||||
ReturnURL: h.App.Config.WechatPayConfig.ReturnURL,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
resp.ERROR(c, err.Error())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
} else if order.PayWay == "geek" {
|
|
||||||
params := payment.GeekPayParams{
|
|
||||||
OutTradeNo: orderNo,
|
|
||||||
Method: "web",
|
|
||||||
Name: order.Subject,
|
|
||||||
Money: fmt.Sprintf("%f", order.Amount),
|
|
||||||
ClientIP: c.ClientIP(),
|
|
||||||
Device: device,
|
|
||||||
Type: payType,
|
|
||||||
ReturnURL: h.App.Config.GeekPayConfig.ReturnURL,
|
|
||||||
NotifyURL: h.App.Config.GeekPayConfig.NotifyURL,
|
|
||||||
}
|
|
||||||
|
|
||||||
res, err := h.geekPayService.Pay(params)
|
|
||||||
if err != nil {
|
|
||||||
resp.ERROR(c, err.Error())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
payURL = res.PayURL
|
|
||||||
}
|
|
||||||
resp.SUCCESS(c, payURL)
|
resp.SUCCESS(c, payURL)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,6 +82,17 @@ func (s *Service) Run() {
|
|||||||
logger.Errorf("taking task with error: %v", err)
|
logger.Errorf("taking task with error: %v", err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// translate prompt
|
||||||
|
if utils.HasChinese(task.Prompt) {
|
||||||
|
content, err := utils.OpenAIRequest(s.db, fmt.Sprintf(service.TranslatePromptTemplate, task.Prompt), "gpt-4o-mini")
|
||||||
|
if err == nil {
|
||||||
|
task.Prompt = content
|
||||||
|
} else {
|
||||||
|
logger.Warnf("error with translate prompt: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var r LumaRespVo
|
var r LumaRespVo
|
||||||
r, err = s.LumaCreate(task)
|
r, err = s.LumaCreate(task)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -17,5 +17,7 @@ type Order struct {
|
|||||||
PayTime int64 `json:"pay_time"`
|
PayTime int64 `json:"pay_time"`
|
||||||
PayWay string `json:"pay_way"`
|
PayWay string `json:"pay_way"`
|
||||||
PayType string `json:"pay_type"`
|
PayType string `json:"pay_type"`
|
||||||
|
PayMethod string `json:"pay_method"`
|
||||||
|
PayName string `json:"pay_name"`
|
||||||
Remark types.OrderRemark `json:"remark"`
|
Remark types.OrderRemark `json:"remark"`
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@ package utils
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
"geekai/core/types"
|
"geekai/core/types"
|
||||||
logger2 "geekai/logger"
|
logger2 "geekai/logger"
|
||||||
"io"
|
"io"
|
||||||
@ -76,3 +77,11 @@ func DownloadImage(imageURL string, proxy string) ([]byte, error) {
|
|||||||
|
|
||||||
return imageBytes, nil
|
return imageBytes, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetBaseURL(strURL string) string {
|
||||||
|
u, err := url.Parse(strURL)
|
||||||
|
if err != nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("%s://%s", u.Scheme, u.Host)
|
||||||
|
}
|
||||||
|
@ -22,7 +22,8 @@
|
|||||||
<span>{{ scope.row.remark?.power }}</span>
|
<span>{{ scope.row.remark?.power }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="pay_way" label="支付方式"/>
|
<el-table-column prop="pay_method" label="支付渠道"/>
|
||||||
|
<el-table-column prop="pay_name" label="支付名称"/>
|
||||||
<el-table-column label="支付时间">
|
<el-table-column label="支付时间">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<span v-if="scope.row['pay_time']">{{ dateFormat(scope.row['pay_time']) }}</span>
|
<span v-if="scope.row['pay_time']">{{ dateFormat(scope.row['pay_time']) }}</span>
|
||||||
|
@ -48,7 +48,8 @@
|
|||||||
<el-tag v-else>未支付</el-tag>
|
<el-tag v-else>未支付</el-tag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="pay_way" label="支付方式"/>
|
<el-table-column prop="pay_method" label="支付渠道"/>
|
||||||
|
<el-table-column prop="pay_name" label="支付名称"/>
|
||||||
|
|
||||||
<el-table-column label="操作" width="180">
|
<el-table-column label="操作" width="180">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
|
@ -56,25 +56,21 @@
|
|||||||
<div class="product-list">
|
<div class="product-list">
|
||||||
<h3>充值套餐</h3>
|
<h3>充值套餐</h3>
|
||||||
<div class="item" v-for="item in products" :key="item.id">
|
<div class="item" v-for="item in products" :key="item.id">
|
||||||
<h4 class="title">
|
<div class="title">
|
||||||
<span>{{ item.name }}</span>
|
<span class="name">{{ item.name }}</span>
|
||||||
<div class="buy-btn">
|
<div class="pay-btn">
|
||||||
<van-button type="primary" @click="pay('alipay',item)" size="small" v-if="payWays['alipay']">
|
<div v-for="payWay in payWays" @click="pay(item,payWay)" :key="payWay">
|
||||||
|
<span v-if="payWay.pay_way === 'geek'">
|
||||||
|
<van-button type="primary" size="small" v-if="payWay.pay_type==='alipay'" >
|
||||||
<i class="iconfont icon-alipay"></i> 支付宝
|
<i class="iconfont icon-alipay"></i> 支付宝
|
||||||
</van-button>
|
</van-button>
|
||||||
<van-button type="success" @click="pay('hupi',item)" size="small" v-if="payWays['hupi']">
|
<van-button type="success" size="small" v-if="payWay.pay_type==='wxpay'" >
|
||||||
<span v-if="payWays['hupi']['name'] === 'wechat'"><i class="iconfont icon-wechat-pay"></i> 微信</span>
|
<i class="iconfont icon-wechat-pay"></i> 微信支付
|
||||||
<span v-else><i class="iconfont icon-alipay"></i> 支付宝</span>
|
|
||||||
</van-button>
|
|
||||||
|
|
||||||
<van-button type="success" @click="pay('payjs',item)" size="small" v-if="payWays['payjs']">
|
|
||||||
<span><i class="iconfont icon-wechat-pay"></i> 微信</span>
|
|
||||||
</van-button>
|
|
||||||
<van-button type="primary" @click="pay('wechat',item)" size="small" v-if="payWays['wechat']">
|
|
||||||
<i class="iconfont icon-wechat-pay"></i> 微信
|
|
||||||
</van-button>
|
</van-button>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</h4>
|
|
||||||
|
|
||||||
<van-cell-group>
|
<van-cell-group>
|
||||||
<van-cell title="商品价格">
|
<van-cell title="商品价格">
|
||||||
@ -155,7 +151,7 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import {onMounted, ref} from "vue";
|
import {onMounted, ref} from "vue";
|
||||||
import {showFailToast, showNotify, showSuccessToast} from "vant";
|
import {showFailToast, showLoadingToast, showNotify, showSuccessToast} from "vant";
|
||||||
import {httpGet, httpPost} from "@/utils/http";
|
import {httpGet, httpPost} from "@/utils/http";
|
||||||
import Compressor from 'compressorjs';
|
import Compressor from 'compressorjs';
|
||||||
import {dateFormat, isWeChatBrowser, showLoginDialog} from "@/utils/libs";
|
import {dateFormat, isWeChatBrowser, showLoginDialog} from "@/utils/libs";
|
||||||
@ -165,6 +161,7 @@ import {useRouter} from "vue-router";
|
|||||||
import {removeUserToken} from "@/store/session";
|
import {removeUserToken} from "@/store/session";
|
||||||
import bus from '@/store/eventbus'
|
import bus from '@/store/eventbus'
|
||||||
import {getMobileTheme} from "@/store/system";
|
import {getMobileTheme} from "@/store/system";
|
||||||
|
import QRCode from "qrcode";
|
||||||
|
|
||||||
const form = ref({
|
const form = ref({
|
||||||
username: 'GeekMaster',
|
username: 'GeekMaster',
|
||||||
@ -224,33 +221,33 @@ onMounted(() => {
|
|||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
const afterRead = (file) => {
|
// const afterRead = (file) => {
|
||||||
file.status = 'uploading';
|
// file.status = 'uploading';
|
||||||
file.message = '上传中...';
|
// file.message = '上传中...';
|
||||||
// 压缩图片并上传
|
// // 压缩图片并上传
|
||||||
new Compressor(file.file, {
|
// new Compressor(file.file, {
|
||||||
quality: 0.6,
|
// quality: 0.6,
|
||||||
success(result) {
|
// success(result) {
|
||||||
const formData = new FormData();
|
// const formData = new FormData();
|
||||||
formData.append('file', result, result.name);
|
// formData.append('file', result, result.name);
|
||||||
// 执行上传操作
|
// // 执行上传操作
|
||||||
httpPost('/api/upload', formData).then((res) => {
|
// httpPost('/api/upload', formData).then((res) => {
|
||||||
form.value.avatar = res.data.url
|
// form.value.avatar = res.data.url
|
||||||
file.status = 'success'
|
// file.status = 'success'
|
||||||
httpPost('/api/user/profile/update', form.value).then(() => {
|
// httpPost('/api/user/profile/update', form.value).then(() => {
|
||||||
showSuccessToast('上传成功')
|
// showSuccessToast('上传成功')
|
||||||
}).catch(() => {
|
// }).catch(() => {
|
||||||
showFailToast('上传失败')
|
// showFailToast('上传失败')
|
||||||
})
|
// })
|
||||||
}).catch((e) => {
|
// }).catch((e) => {
|
||||||
showNotify({type: 'danger', message: '上传失败:' + e.message})
|
// showNotify({type: 'danger', message: '上传失败:' + e.message})
|
||||||
})
|
// })
|
||||||
},
|
// },
|
||||||
error(err) {
|
// error(err) {
|
||||||
console.log(err.message);
|
// console.log(err.message);
|
||||||
},
|
// },
|
||||||
});
|
// });
|
||||||
}
|
// }
|
||||||
|
|
||||||
const showPasswordDialog = ref(false)
|
const showPasswordDialog = ref(false)
|
||||||
const pass = ref({
|
const pass = ref({
|
||||||
@ -290,21 +287,23 @@ const updatePass = () => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const pay = (payWay, item) => {
|
const pay = (product,payWay) => {
|
||||||
if (!isLogin.value) {
|
if (!isLogin.value) {
|
||||||
return showLoginDialog(router)
|
return showLoginDialog(router)
|
||||||
}
|
}
|
||||||
|
|
||||||
httpPost("/api/payment/mobile", {
|
showLoadingToast({
|
||||||
pay_way: payWay,
|
message: '正在创建订单',
|
||||||
product_id: item.id,
|
forbidClick: true,
|
||||||
user_id: userId.value
|
});
|
||||||
|
httpGet(`${process.env.VUE_APP_API_HOST}/api/payment/doPay`, {
|
||||||
|
product_id: product.id,
|
||||||
|
pay_way: payWay.pay_way,
|
||||||
|
pay_type: payWay.pay_type,
|
||||||
|
user_id: userId.value,
|
||||||
|
device: "wechat"
|
||||||
}).then(res => {
|
}).then(res => {
|
||||||
if (isWeChatBrowser() && payWay === 'wechat') {
|
location.href = res.data
|
||||||
showFailToast("请在系统自带浏览器打开支付页面,或者在 PC 端进行扫码支付")
|
|
||||||
} else {
|
|
||||||
location.href = res.data.url
|
|
||||||
}
|
|
||||||
}).catch(e => {
|
}).catch(e => {
|
||||||
showFailToast("生成支付订单失败:" + e.message)
|
showFailToast("生成支付订单失败:" + e.message)
|
||||||
})
|
})
|
||||||
@ -363,13 +362,19 @@ const changeTheme = () => {
|
|||||||
overflow hidden
|
overflow hidden
|
||||||
|
|
||||||
.title {
|
.title {
|
||||||
padding 0 12px
|
padding 12px
|
||||||
position relative
|
position relative
|
||||||
|
|
||||||
.buy-btn {
|
.name {
|
||||||
|
font-size 16px
|
||||||
|
font-weight 700
|
||||||
|
}
|
||||||
|
|
||||||
|
.pay-btn {
|
||||||
position absolute
|
position absolute
|
||||||
top -5px
|
top 5px
|
||||||
right 10px
|
right 10px
|
||||||
|
display flex
|
||||||
|
|
||||||
.van-button {
|
.van-button {
|
||||||
font-size 14px
|
font-size 14px
|
||||||
|
Loading…
Reference in New Issue
Block a user