diff --git a/go.mod b/go.mod index adb6e2e..111e3ae 100644 --- a/go.mod +++ b/go.mod @@ -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 diff --git a/go.sum b/go.sum index 5c9534b..8b4bcec 100644 --- a/go.sum +++ b/go.sum @@ -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= diff --git a/src/api/20240724-community.go b/src/api/20240724-community.go index e03dc66..aa91ae8 100644 --- a/src/api/20240724-community.go +++ b/src/api/20240724-community.go @@ -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" diff --git a/src/api/20240724-education.go b/src/api/20240724-education.go index 376bf95..15db1fa 100644 --- a/src/api/20240724-education.go +++ b/src/api/20240724-education.go @@ -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" diff --git a/src/api/20240903-operation.go b/src/api/20240903-operation.go index 7a3dc8d..efd7ffd 100644 --- a/src/api/20240903-operation.go +++ b/src/api/20240903-operation.go @@ -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" diff --git a/src/gonganxitong/common.go b/src/gonganxitong/common.go index 436f795..122eaa0 100644 --- a/src/gonganxitong/common.go +++ b/src/gonganxitong/common.go @@ -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 }) diff --git a/src/gonganxitong/model/model.go b/src/gonganxitong/model/model.go index f1c99a8..73c44f0 100644 --- a/src/gonganxitong/model/model.go +++ b/src/gonganxitong/model/model.go @@ -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 { diff --git a/src/gonganxitong/paymentlist.go b/src/gonganxitong/paymentlist.go index 61cd1bb..aa4bfe4 100644 --- a/src/gonganxitong/paymentlist.go +++ b/src/gonganxitong/paymentlist.go @@ -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 diff --git a/src/gonganxitong/paymentlist.js b/src/gonganxitong/paymentlist.js index 60c4598..e3b8e34 100644 --- a/src/gonganxitong/paymentlist.js +++ b/src/gonganxitong/paymentlist.js @@ -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() + }) + }) + }, }) \ No newline at end of file diff --git a/src/gonganxitong/portal.json b/src/gonganxitong/portal.json index 6e24807..b4b697f 100644 --- a/src/gonganxitong/portal.json +++ b/src/gonganxitong/portal.json @@ -67,6 +67,7 @@ "auth_status": "认证状态", "auth_avatar": "认证头像", "auth_background": "认证背景", + "paymentlist_status": "支付状态", "qrcode_type": "链接类型", "apply_status": "申请状态", "allow_status": "审批状态", diff --git a/src/renzhengshouquan/external/weixinpayment/model/model.go b/src/renzhengshouquan/external/weixinpayment/model/model.go index 9c1cae9..a660c10 100644 --- a/src/renzhengshouquan/external/weixinpayment/model/model.go +++ b/src/renzhengshouquan/external/weixinpayment/model/model.go @@ -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{}) } diff --git a/src/renzhengshouquan/external/weixinpayment/weixinpayment.go b/src/renzhengshouquan/external/weixinpayment/weixinpayment.go index 166aa87..76fdfb6 100644 --- a/src/renzhengshouquan/external/weixinpayment/weixinpayment.go +++ b/src/renzhengshouquan/external/weixinpayment/weixinpayment.go @@ -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 "" } diff --git a/src/renzhengshouquan/external/weixinpayment/weixinpayment.shy b/src/renzhengshouquan/external/weixinpayment/weixinpayment.shy index aa4ad88..d6b63eb 100644 --- a/src/renzhengshouquan/external/weixinpayment/weixinpayment.shy +++ b/src/renzhengshouquan/external/weixinpayment/weixinpayment.shy @@ -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 ` \ No newline at end of file diff --git a/src/template/web.code.js/demo.js b/src/template/web.code.js/demo.js index 9aac8a3..ca4d65c 100644 --- a/src/template/web.code.js/demo.js +++ b/src/template/web.code.js/demo.js @@ -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]}, ] })