This commit is contained in:
IT 老营长 @云轩领航-创始人 2024-11-23 16:51:26 +08:00
parent d7a8be98ae
commit dd0c095c17
14 changed files with 229 additions and 166 deletions

1
go.mod
View File

@ -25,6 +25,7 @@ require (
github.com/go-sql-driver/mysql v1.7.0 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/wechatpay-apiv3/wechatpay-go v0.2.20 // indirect
golang.org/x/text v0.16.0 // indirect
gorm.io/driver/mysql v1.5.7 // indirect
gorm.io/gorm v1.25.11 // indirect

4
go.sum
View File

@ -1,5 +1,6 @@
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/PuerkitoBio/goquery v1.9.1/go.mod h1:cW1n6TmIMDoORQU5IU/P1T3tGFunOeXEpGP2WHRwkbY=
github.com/agiledragon/gomonkey v2.0.2+incompatible/go.mod h1:2NGfXu1a80LLr2cmWXGBDaHEjb1idR6+FVlX5T3D9hw=
github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU=
github.com/bgould/http v0.0.0-20190627042742-d268792bdee7/go.mod h1:BTqvVegvwifopl4KTEDth6Zezs9eR+lCWhvGKvkxJHE=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@ -60,6 +61,7 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/tdakkota/win32metadata v0.1.0/go.mod h1:77e6YvX0LIVW+O81fhWLnXAxxcyu/wdZdG7iwed7Fyk=
@ -68,6 +70,8 @@ github.com/tinygo-org/pio v0.0.0-20231216154340-cd888eb58899/go.mod h1:LU7Dw00NJ
github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0=
github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY=
github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY=
github.com/wechatpay-apiv3/wechatpay-go v0.2.20 h1:gS8oFn1bHGnyapR2Zb4aqTV6l4kJWgbtqjCq6k1L9DQ=
github.com/wechatpay-apiv3/wechatpay-go v0.2.20/go.mod h1:A254AUBVB6R+EqQFo3yTgeh7HtyqRRtN2w9hQSOrd4Q=
github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/yuin/goldmark v1.5.5/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=

View File

@ -13,6 +13,7 @@ const GONGANXITONG_MEETING = "web.team.gonganxitong.meeting"
const GONGANXITONG_MEMBER = "web.team.gonganxitong.member"
const GONGANXITONG_MESSAGE = "web.team.gonganxitong.message"
const GONGANXITONG_NOTICE = "web.team.gonganxitong.notice"
const GONGANXITONG_PAYMENTLIST = "web.team.gonganxitong.paymentlist"
const GONGANXITONG_QRCODE = "web.team.gonganxitong.qrcode"
const GONGANXITONG_RECENT = "web.team.gonganxitong.recent"
const GONGANXITONG_SERVICE = "web.team.gonganxitong.service"
@ -31,6 +32,7 @@ const HUODONGZUZHI_MEETING = "web.team.huodongzuzhi.meeting"
const HUODONGZUZHI_MEMBER = "web.team.huodongzuzhi.member"
const HUODONGZUZHI_MESSAGE = "web.team.huodongzuzhi.message"
const HUODONGZUZHI_NOTICE = "web.team.huodongzuzhi.notice"
const HUODONGZUZHI_PAYMENTLIST = "web.team.huodongzuzhi.paymentlist"
const HUODONGZUZHI_QRCODE = "web.team.huodongzuzhi.qrcode"
const HUODONGZUZHI_RECENT = "web.team.huodongzuzhi.recent"
const HUODONGZUZHI_SERVICE = "web.team.huodongzuzhi.service"
@ -47,11 +49,13 @@ const RENZHENGSHOUQUAN_DOMAIN = "web.team.renzhengshouquan.domain"
const RENZHENGSHOUQUAN_EVENT = "web.team.renzhengshouquan.event"
const RENZHENGSHOUQUAN_EXTERNAL_TENCENT_MEETING = "web.team.renzhengshouquan.external.tencent.meeting"
const RENZHENGSHOUQUAN_EXTERNAL_TENCENTMEETING_TENCENTMEETING = "web.team.renzhengshouquan.external.tencentmeeting.tencentmeeting"
const RENZHENGSHOUQUAN_EXTERNAL_WEIXINPAYMENT_WEIXINPAYMENT = "web.team.renzhengshouquan.external.weixinpayment.weixinpayment"
const RENZHENGSHOUQUAN_MARKET = "web.team.renzhengshouquan.market"
const RENZHENGSHOUQUAN_MEETING = "web.team.renzhengshouquan.meeting"
const RENZHENGSHOUQUAN_MEMBER = "web.team.renzhengshouquan.member"
const RENZHENGSHOUQUAN_MESSAGE = "web.team.renzhengshouquan.message"
const RENZHENGSHOUQUAN_NOTICE = "web.team.renzhengshouquan.notice"
const RENZHENGSHOUQUAN_PAYMENTLIST = "web.team.renzhengshouquan.paymentlist"
const RENZHENGSHOUQUAN_PROFILE = "web.team.renzhengshouquan.profile"
const RENZHENGSHOUQUAN_QRCODE = "web.team.renzhengshouquan.qrcode"
const RENZHENGSHOUQUAN_RECENT = "web.team.renzhengshouquan.recent"
@ -71,6 +75,7 @@ const YUEHAOXITONG_MEMBER = "web.team.yuehaoxitong.member"
const YUEHAOXITONG_MESSAGE = "web.team.yuehaoxitong.message"
const YUEHAOXITONG_NOTICE = "web.team.yuehaoxitong.notice"
const YUEHAOXITONG_OPEN = "web.team.yuehaoxitong.open"
const YUEHAOXITONG_PAYMENTLIST = "web.team.yuehaoxitong.paymentlist"
const YUEHAOXITONG_PLAN = "web.team.yuehaoxitong.plan"
const YUEHAOXITONG_QRCODE = "web.team.yuehaoxitong.qrcode"
const YUEHAOXITONG_RECENT = "web.team.yuehaoxitong.recent"

View File

@ -7,6 +7,7 @@ const JIAOCAIZILIAO_CREDIT = "web.team.jiaocaiziliao.credit"
const JIAOCAIZILIAO_DOCUMENT = "web.team.jiaocaiziliao.document"
const JIAOCAIZILIAO_EVENT = "web.team.jiaocaiziliao.event"
const JIAOCAIZILIAO_MARKET = "web.team.jiaocaiziliao.market"
const JIAOCAIZILIAO_MEETING = "web.team.jiaocaiziliao.meeting"
const JIAOCAIZILIAO_MEMBER = "web.team.jiaocaiziliao.member"
const JIAOCAIZILIAO_MESSAGE = "web.team.jiaocaiziliao.message"
const JIAOCAIZILIAO_NOTICE = "web.team.jiaocaiziliao.notice"
@ -23,6 +24,7 @@ const JIAOWUXITONG_CREDIT = "web.team.jiaowuxitong.credit"
const JIAOWUXITONG_EVENT = "web.team.jiaowuxitong.event"
const JIAOWUXITONG_HOMEWORK = "web.team.jiaowuxitong.homework"
const JIAOWUXITONG_MARKET = "web.team.jiaowuxitong.market"
const JIAOWUXITONG_MEETING = "web.team.jiaowuxitong.meeting"
const JIAOWUXITONG_MEMBER = "web.team.jiaowuxitong.member"
const JIAOWUXITONG_MESSAGE = "web.team.jiaowuxitong.message"
const JIAOWUXITONG_NOTICE = "web.team.jiaowuxitong.notice"
@ -53,6 +55,7 @@ const ZAIXIANKETANG_CREDIT = "web.team.zaixianketang.credit"
const ZAIXIANKETANG_EVENT = "web.team.zaixianketang.event"
const ZAIXIANKETANG_LESSON = "web.team.zaixianketang.lesson"
const ZAIXIANKETANG_MARKET = "web.team.zaixianketang.market"
const ZAIXIANKETANG_MEETING = "web.team.zaixianketang.meeting"
const ZAIXIANKETANG_MEMBER = "web.team.zaixianketang.member"
const ZAIXIANKETANG_MESSAGE = "web.team.zaixianketang.message"
const ZAIXIANKETANG_NOTICE = "web.team.zaixianketang.notice"

View File

@ -7,6 +7,7 @@ const DASHBOARD_CREDIT = "web.team.dashboard.credit"
const DASHBOARD_DASHBOARD = "web.team.dashboard.dashboard"
const DASHBOARD_EVENT = "web.team.dashboard.event"
const DASHBOARD_MARKET = "web.team.dashboard.market"
const DASHBOARD_MEETING = "web.team.dashboard.meeting"
const DASHBOARD_MEMBER = "web.team.dashboard.member"
const DASHBOARD_MESSAGE = "web.team.dashboard.message"
const DASHBOARD_NOTICE = "web.team.dashboard.notice"
@ -23,6 +24,7 @@ const DEVELOPMENT_CREDIT = "web.team.development.credit"
const DEVELOPMENT_EVENT = "web.team.development.event"
const DEVELOPMENT_HISTORY = "web.team.development.history"
const DEVELOPMENT_MARKET = "web.team.development.market"
const DEVELOPMENT_MEETING = "web.team.development.meeting"
const DEVELOPMENT_MEMBER = "web.team.development.member"
const DEVELOPMENT_MESSAGE = "web.team.development.message"
const DEVELOPMENT_NOTICE = "web.team.development.notice"
@ -39,6 +41,7 @@ const OPERATION_APPLY = "web.team.operation.apply"
const OPERATION_CREDIT = "web.team.operation.credit"
const OPERATION_EVENT = "web.team.operation.event"
const OPERATION_MARKET = "web.team.operation.market"
const OPERATION_MEETING = "web.team.operation.meeting"
const OPERATION_MEMBER = "web.team.operation.member"
const OPERATION_MESSAGE = "web.team.operation.message"
const OPERATION_NOTICE = "web.team.operation.notice"
@ -56,6 +59,7 @@ const PRODUCTION_CREDIT = "web.team.production.credit"
const PRODUCTION_EVENT = "web.team.production.event"
const PRODUCTION_ISSUE = "web.team.production.issue"
const PRODUCTION_MARKET = "web.team.production.market"
const PRODUCTION_MEETING = "web.team.production.meeting"
const PRODUCTION_MEMBER = "web.team.production.member"
const PRODUCTION_MESSAGE = "web.team.production.message"
const PRODUCTION_NOTICE = "web.team.production.notice"
@ -73,11 +77,4 @@ const STORAGE_CREDIT = "web.team.storage.credit"
const STORAGE_EVENT = "web.team.storage.event"
const STORAGE_FILE = "web.team.storage.file"
const STORAGE_MARKET = "web.team.storage.market"
const STORAGE_MEMBER = "web.team.storage.member"
const STORAGE_MESSAGE = "web.team.storage.message"
const STORAGE_NOTICE = "web.team.storage.notice"
const STORAGE_QRCODE = "web.team.storage.qrcode"
const STORAGE_RECENT = "web.team.storage.recent"
const STORAGE_SERVICE = "web.team.storage.service"
const STORAGE_SETTING = "web.team.storage.setting"
const STORAGE_SUPPORT = "web.team.storage.support"
const STORAGE_MEETING = "web.team.storage.meeting"

View File

@ -254,6 +254,8 @@ func (s Table) RewriteAppend(m *ice.Message, arg ...string) *ice.Message {
value = AllowStatus(kit.Int(value)).String()
case model.MESSAGE_STATUS:
value = MessageStatus(kit.Int(value)).String()
case model.PAYMENTLIST_STATUS:
value = PaymentStatus(kit.Int(value)).String()
}
return value
})

View File

@ -3,110 +3,111 @@ package model
import "shylinux.com/x/mysql-story/src/db"
const (
UID = "uid"
NAME = "name"
INFO = "info"
TYPE = "type"
ROLE = "role"
STATUS = "status"
TITLE = "title"
CONTENT = "content"
AVATAR = "avatar"
BACKGROUND = "background"
CREATED_AT = "created_at"
UPDATED_AT = "updated_at"
USER_UID = "user_uid"
USER_NAME = "user_name"
USER_INFO = "user_info"
USER_ROLE = "user_role"
USER_AVATAR = "user_avatar"
USER_BACKGROUND = "user_background"
USER_PLACE_ROLE = "user_place_role"
MEMBER_UID = "member_uid"
MEMBER_STATUS = "member_status"
PLACE_UID = "place_uid"
PLACE_NAME = "place_name"
PLACE_TYPE = "place_type"
PLACE_INIT = "place_init"
PLACE_ADDRESS = "place_address"
STREET_UID = "street_uid"
STREET_NAME = "street_name"
STREET_INFO = "street_info"
STREET_AVATAR = "street_avatar"
STREET_BACKGROUND = "street_background"
SCHOOL_NAME = "school_name"
COMPANY_NAME = "company_name"
CITY_UID = "city_uid"
CITY_NAME = "city_name"
CITY_INFO = "city_info"
CITY_AVATAR = "city_avatar"
CITY_BACKGROUND = "city_background"
AUTH_UID = "auth_uid"
AUTH_NAME = "auth_name"
AUTH_INFO = "auth_info"
AUTH_TYPE = "auth_type"
AUTH_STATUS = "auth_status"
AUTH_AVATAR = "auth_avatar"
AUTH_BACKGROUND = "auth_background"
DASHBOARD_UID = "dashboard_uid"
DASHBOARD_NAME = "dashboard_name"
DASHBOARD_TYPE = "dashboard_type"
STORAGE_UID = "storage_uid"
STORAGE_NAME = "storage_name"
STORAGE_TYPE = "storage_type"
QRCODE_TYPE = "qrcode_type"
APPLY_UID = "apply_uid"
APPLY_STATUS = "apply_status"
ALLOW_UID = "allow_uid"
ALLOW_STATUS = "allow_status"
EVENT_UID = "event_uid"
DOMAIN_UID = "domain_uid"
DOMAIN_NAME = "domain_name"
MARKET_UID = "market_uid"
COMMAND_UID = "command_uid"
COMMAND_ICON = "command_icon"
COMMAND_NAME = "command_name"
MESSAGE_UID = "message_uid"
MESSAGE_STATUS = "message_status"
SERVICE_UID = "service_uid"
SERVICE_ICON = "service_icon"
SERVICE_NAME = "service_name"
SERVICE_TYPE = "service_type"
SERVICE_STATUS = "service_status"
THUMB_COUNT = "thumb_count"
FAVOR_COUNT = "favor_count"
COMMENT_COUNT = "comment_count"
SHARE_COUNT = "share_count"
THUMB_STATUS = "thumb_status"
FAVOR_STATUS = "favor_status"
FROM_UID = "from_uid"
FROM_USER_UID = "from_user_uid"
TO_USER_UID = "to_user_uid"
BEGIN_TIME = "begin_time"
END_TIME = "end_time"
OPEN_ID = "open_id"
USER_ID = "user_id"
VENDOR = "vendor"
PHONE = "phone"
EMAIL = "email"
ADDRESS = "address"
PORTAL = "portal"
PORTAL_NAME = "portal_name"
NODE_NAME = "node_name"
NODENAME = "nodename"
NODETYPE = "nodetype"
SPACE = "space"
INDEX = "index"
FIELD = "field"
ICON = "icon"
ARGS = "args"
INIT = "init"
QUERY = "query"
VALUE = "value"
SCORE = "score"
LEVEL = "level"
UNIT = "unit"
LINK = "link"
UID = "uid"
NAME = "name"
INFO = "info"
TYPE = "type"
ROLE = "role"
STATUS = "status"
TITLE = "title"
CONTENT = "content"
AVATAR = "avatar"
BACKGROUND = "background"
CREATED_AT = "created_at"
UPDATED_AT = "updated_at"
USER_UID = "user_uid"
USER_NAME = "user_name"
USER_INFO = "user_info"
USER_ROLE = "user_role"
USER_AVATAR = "user_avatar"
USER_BACKGROUND = "user_background"
USER_PLACE_ROLE = "user_place_role"
MEMBER_UID = "member_uid"
MEMBER_STATUS = "member_status"
PLACE_UID = "place_uid"
PLACE_NAME = "place_name"
PLACE_TYPE = "place_type"
PLACE_INIT = "place_init"
PLACE_ADDRESS = "place_address"
STREET_UID = "street_uid"
STREET_NAME = "street_name"
STREET_INFO = "street_info"
STREET_AVATAR = "street_avatar"
STREET_BACKGROUND = "street_background"
SCHOOL_NAME = "school_name"
COMPANY_NAME = "company_name"
CITY_UID = "city_uid"
CITY_NAME = "city_name"
CITY_INFO = "city_info"
CITY_AVATAR = "city_avatar"
CITY_BACKGROUND = "city_background"
AUTH_UID = "auth_uid"
AUTH_NAME = "auth_name"
AUTH_INFO = "auth_info"
AUTH_TYPE = "auth_type"
AUTH_STATUS = "auth_status"
AUTH_AVATAR = "auth_avatar"
AUTH_BACKGROUND = "auth_background"
PAYMENTLIST_STATUS = "paymentlist_status"
DASHBOARD_UID = "dashboard_uid"
DASHBOARD_NAME = "dashboard_name"
DASHBOARD_TYPE = "dashboard_type"
STORAGE_UID = "storage_uid"
STORAGE_NAME = "storage_name"
STORAGE_TYPE = "storage_type"
QRCODE_TYPE = "qrcode_type"
APPLY_UID = "apply_uid"
APPLY_STATUS = "apply_status"
ALLOW_UID = "allow_uid"
ALLOW_STATUS = "allow_status"
EVENT_UID = "event_uid"
DOMAIN_UID = "domain_uid"
DOMAIN_NAME = "domain_name"
MARKET_UID = "market_uid"
COMMAND_UID = "command_uid"
COMMAND_ICON = "command_icon"
COMMAND_NAME = "command_name"
MESSAGE_UID = "message_uid"
MESSAGE_STATUS = "message_status"
SERVICE_UID = "service_uid"
SERVICE_ICON = "service_icon"
SERVICE_NAME = "service_name"
SERVICE_TYPE = "service_type"
SERVICE_STATUS = "service_status"
THUMB_COUNT = "thumb_count"
FAVOR_COUNT = "favor_count"
COMMENT_COUNT = "comment_count"
SHARE_COUNT = "share_count"
THUMB_STATUS = "thumb_status"
FAVOR_STATUS = "favor_status"
FROM_UID = "from_uid"
FROM_USER_UID = "from_user_uid"
TO_USER_UID = "to_user_uid"
BEGIN_TIME = "begin_time"
END_TIME = "end_time"
OPEN_ID = "open_id"
USER_ID = "user_id"
VENDOR = "vendor"
PHONE = "phone"
EMAIL = "email"
ADDRESS = "address"
PORTAL = "portal"
PORTAL_NAME = "portal_name"
NODE_NAME = "node_name"
NODENAME = "nodename"
NODETYPE = "nodetype"
SPACE = "space"
INDEX = "index"
FIELD = "field"
ICON = "icon"
ARGS = "args"
INIT = "init"
QUERY = "query"
VALUE = "value"
SCORE = "score"
LEVEL = "level"
UNIT = "unit"
LINK = "link"
)
type Sess struct {

View File

@ -2,6 +2,7 @@ package gonganxitong
import (
"shylinux.com/x/ice"
"shylinux.com/x/toolkits"
"shylinux.com/x/community/src/gonganxitong/model"
)
@ -9,35 +10,58 @@ import (
type paymentlist struct {
Table
order string `data:"92"`
fields string `data:"title,content,amount"`
create string `name:"create title* content amount* vendor_uid" role:"leader"`
remove string `name:"remove" role:"leader"`
payfor string `name:"payfor" role:"void"`
fields string `data:"user_uid,paymentlist_status,amount,title,content"`
create string `name:"create amount* title* content" role:"leader"`
payfor string `name:"payfor" help:"支付" style:"notice" role:"void"`
}
func (s paymentlist) Inputs(m *ice.Message, arg ...string) {
switch arg[0] {
case "vendor_uid":
}
}
func (s paymentlist) List(m *ice.Message, arg ...string) {
s.ValueList(m, arg).Display("")
m.PushAction(s.Payfor)
s.ValueList(m, arg).Table(func(value ice.Maps) {
switch PaymentStatus(kit.Int(value[model.PAYMENTLIST_STATUS])) {
case PaymentCreate:
m.PushButton(s.Payfor)
case PaymentSuccess:
m.PushButton()
default:
m.PushButton()
}
}).Display("")
s.SelectJoinUser(m)
}
func (s paymentlist) Payfor(m *ice.Message, arg ...string) {
s.cmdy(m, s.PaymentRequest, arg...)
s.cmdy(m, s.Request, arg...)
}
func (s paymentlist) Request(m *ice.Message, arg ...string) {}
func (s paymentlist) Response(m *ice.Message, arg ...string) {
if len(arg) > 1 {
s.Update(m, kit.Dict(model.STATUS, PaymentSuccess), s.PLACE_UID, arg[0], model.UID, arg[1])
}
}
func (s paymentlist) PaymentRequest(m *ice.Message, arg ...string) {}
func init() { ice.TeamCtxCmd(paymentlist{Table: newTable()}) }
func (s paymentlist) cmdy(m *ice.Message, action ice.Any, arg ...string) {
m.Option(model.PLACE_UID, m.Option(s.PLACE_UID))
m.Cmdy(paymentVendorKey, action, arg)
m.Options(model.PLACE_UID, m.Option(s.PLACE_UID)).Cmdy(paymentVendorKey, action, arg)
}
type PaymentStatus int
const (
PaymentCreate PaymentStatus = iota
PaymentSuccess
PaymentFailure
)
var PaymentStatusList = map[PaymentStatus]string{
PaymentCreate: "create",
PaymentSuccess: "success",
PaymentFailure: "failure",
}
func (s PaymentStatus) String() string { return PaymentStatusList[s] }
type PaymentVendor interface {
PaymentRequest(m *ice.Message, arg ...string) *ice.Message
Request(m *ice.Message, arg ...string) *ice.Message
}
var paymentVendorKey string

View File

@ -1,9 +1,23 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) {
can.onimport.myView(can, msg, function(value) { return [
{view: html.TITLE, list: [value.title, "¥ "+value.amount]},
{view: html.TITLE, list: [value.title, "¥ "+(value.amount/100), can.onimport.titleAction(can, value)]},
{view: html.STATUS, list: [value.uid.slice(0, 6), can.onimport.timeView(can, value), value.user_name]},
{view: html.OUTPUT, list: [value.content]},
] })
},
})
Volcanos(chat.ONACTION, {
payfor: function(event, can) {
debugger
can.runAction(event, "payfor", [], function(msg) {
debugger
if(msg.IsErr()) { return }
WeixinJSBridge.invoke('getBrandWCPayRequest', msg.Table()[0], function(res) {
debugger
alert(JSON.stringify(res))
can.Update()
})
})
},
})

View File

@ -67,6 +67,7 @@
"auth_status": "认证状态",
"auth_avatar": "认证头像",
"auth_background": "认证背景",
"paymentlist_status": "支付状态",
"qrcode_type": "链接类型",
"apply_status": "申请状态",
"allow_status": "审批状态",

View File

@ -5,6 +5,8 @@ import "shylinux.com/x/mysql-story/src/db"
const (
UID = "uid"
TITLE = "title"
CONTENT = "content"
AMOUNT = "amount"
OPEN_ID = "open_id"
USER_UID = "user_uid"
PLACE_UID = "place_uid"
@ -18,6 +20,9 @@ type Weixinpayment struct {
UserUID string `gorm:"type:char(32)"`
AppID string `gorm:"type:varchar(32)"`
MchID string `gorm:"type:varchar(32)"`
ApiKey string `gorm:"type:varchar(32)"`
CertNO string `gorm:"type:varchar(64)"`
CertKey string `gorm:"type:varchar(4096)"`
}
func init() { db.CmdModels("", &Weixinpayment{}) }

View File

@ -1,25 +1,29 @@
package weixinpayment
import (
"net/http"
"strings"
"shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/community/src/api"
"shylinux.com/x/community/src/gonganxitong"
"shylinux.com/x/community/src/renzhengshouquan"
"shylinux.com/x/community/src/renzhengshouquan/external/weixinpayment/model"
"github.com/wechatpay-apiv3/wechatpay-go/core"
"github.com/wechatpay-apiv3/wechatpay-go/core/option"
"github.com/wechatpay-apiv3/wechatpay-go/services/payments/jsapi"
"github.com/wechatpay-apiv3/wechatpay-go/utils"
)
type weixinpayment struct {
renzhengshouquan.Table
order string `data:"11"`
fields string `data:"app_id,mch_id"`
create string `name:"create app_id* mch_id*" role:"leader"`
remove string `name:"remove" role:"leader"`
order string `data:"11"`
fields string `data:"app_id,mch_id,api_key,cert_no,cert_key"`
create string `name:"create app_id* mch_id* api_key* cert_no* cert_key*:textarea" role:"leader"`
remove string `name:"remove" role:"leader"`
response string `name:"response" role:"void"`
}
func (s weixinpayment) Init(m *ice.Message, arg ...string) {
@ -30,42 +34,43 @@ func (s weixinpayment) List(m *ice.Message, arg ...string) {
s.ValueList(m, arg).Display("")
kit.If(m.Length() > 0, func() { m.Action() })
}
func (s weixinpayment) PaymentRequest(m *ice.Message, arg ...string) *ice.Message {
m.Option("auth_uid", "4c6a8ccf186816b332ad9dc5655255dd")
return s.spide(m, "POST", "pay/transactions/jsapi",
"payer.openid", m.Cmd(api.GONGANXITONG_USER, s.Select, model.UID, m.Option(model.USER_UID)).Append(model.OPEN_ID),
"amount.total", kit.Int(m.Option("amount")), "amount.currency", "CNY",
"description", m.Option(model.TITLE), "out_trade_no", m.Option(model.UID),
"notify_url", strings.Split(m.MergePodCmd("", m.PrefixKey()), "?")[0]+"/action/response/"+m.Option(model.PLACE_UID)+"/"+m.Option(model.UID))
func (s weixinpayment) Request(m *ice.Message, arg ...string) *ice.Message {
m.Option("auth_uid", "308a1ca57c40e2a46f6568e017269cdd")
msg := s.Select(m.Spawn(), m.OptionSimple(model.AUTH_UID)...)
svc := jsapi.JsapiApiService{Client: s.newClient(m, msg)}
resp, result, err := svc.PrepayWithRequestPayment(m, jsapi.PrepayRequest{
Appid: core.String(msg.Append("app_id")),
Mchid: core.String(msg.Append("mch_id")),
Description: core.String(m.Option(model.TITLE)),
Attach: core.String(m.Option(model.CONTENT)),
OutTradeNo: core.String(m.Option(model.UID)),
Amount: &jsapi.Amount{Total: core.Int64(kit.Int64(m.Option(model.AMOUNT)))},
Payer: &jsapi.Payer{Openid: core.String(m.Cmd(api.GONGANXITONG_USER, s.Select, model.UID, m.Option(model.USER_UID)).Append(model.OPEN_ID))},
NotifyUrl: core.String(strings.Split(m.MergePodCmd("", m.PrefixKey()), "?")[0] + "/action/response/" + m.Option(model.PLACE_UID) + "/" + m.Option(model.UID)),
})
if !m.Warn(err) {
kit.For(kit.UnMarshal(kit.Format(resp)), func(k, v string) { m.Push(kit.LowerCapital(k), v) })
}
m.Info("what %v %v %v", resp, result, err)
return m
}
func (s weixinpayment) Response(m *ice.Message, arg ...string) *ice.Message {
m.Echo("hello world")
if len(arg) > 1 {
if m.Option("event_type") == "TRANSACTION.SUCCESS" {
m.Cmdy(api.GONGANXITONG_PAYMENTLIST, s.Response, arg)
}
}
return m
}
func init() { ice.TeamCtxCmd(weixinpayment{}) }
func (s weixinpayment) spide(m *ice.Message, method, api string, arg ...ice.Any) *ice.Message {
msg := s.Select(m.Spawn(), m.OptionSimple(model.AUTH_UID)...)
if msg.Length() == 0 {
m.Echo("请联系公司管理员,配置微信支付的账号")
return m
func (s weixinpayment) newClient(m, msg *ice.Message) *core.Client {
if key, err := utils.LoadPrivateKey(msg.Append("cert_key")); m.Warn(err) {
return nil
} else if client, err := core.NewClient(m, option.WithWechatPayAutoAuthCipher(msg.Append("mch_id"), msg.Append("cert_no"), key, msg.Append("api_key"))); m.Warn(err) {
return nil
} else {
return client
}
arg = append(arg, "appid", msg.Append("app_id"), "mchid", msg.Append("mch_id"))
method = kit.Select(http.MethodGet, method)
uri, body, args := kit.MergeURL("/v3/"+api, arg...), "", []string{}
kit.If(kit.IsIn(method, http.MethodPost, http.MethodPut), func() {
uri, body = kit.MergeURL("/v3/"+api), kit.Format(kit.Dict(arg...))
args = []string{web.SPIDE_DATA, body}
})
m.Options(web.SPIDE_HEADER, map[string]string{
"Accept": "application/json", "Authorization": doSignature("", "", method, "", "", uri, body),
}).Cmdy(web.SPIDE, ice.DEV, web.SPIDE_RAW, method, "https://api.mch.weixin.qq.com"+uri, args)
kit.If(kit.IsIn(method, http.MethodPost, http.MethodPut), func() { kit.If(!m.IsErr(), func() { m.ProcessRefresh() }) })
return m
}
func doSignature(secretId string, secretKey string, method string, nonce string, now string, uri string, body string) string {
strings.Join([]string{method, uri, now, nonce, body}, "\n")
return ""
}

View File

@ -2,5 +2,6 @@ chapter "微信支付"
refer `
后台 https://pay.weixin.qq.com/index.php/core/cert/api_cert#/
文档 https://pay.weixin.qq.com/doc/v3/merchant/4012525057
接口 https://github.com/wechatpay-apiv3/wechatpay-go
签名算法 https://segmentfault.com/a/1190000039301729
`

View File

@ -1,7 +1,7 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) {
can.onimport.myView(can, msg, function(value) { return [
{view: html.TITLE, list: [value.title||value.name||value.user_name]},
{view: html.TITLE, list: [value.title||value.name||value.user_name, can.onimport.titleAction(can, value)]},
{view: html.STATUS, list: [value.uid.slice(0, 6), can.onimport.timeView(can, value), value.user_name]},
{view: html.OUTPUT, list: [value.content||value.info]},
] })