diff --git a/rpc/payment/payment.pb b/rpc/payment/payment.pb index a8ffce3..707ca25 100644 Binary files a/rpc/payment/payment.pb and b/rpc/payment/payment.pb differ diff --git a/rpc/payment/payment.proto b/rpc/payment/payment.proto index 81ee847..c08eeaf 100644 --- a/rpc/payment/payment.proto +++ b/rpc/payment/payment.proto @@ -26,16 +26,16 @@ service Payment { }; } - rpc Refund(RefundReq) returns (Response) { + rpc Notify(NotifyReq) returns (Response) { option (google.api.http) = { - post: "/api/v3/payment/refund" + post: "/api/v3/payment/notify" body: "*" }; } - rpc Notify(NotifyReq) returns (Response) { + rpc Refund(RefundReq) returns (Response) { option (google.api.http) = { - post: "/api/v3/payment/notify" + post: "/admin/v3/payment/refund" body: "*" }; } @@ -51,6 +51,7 @@ message PayReq { string order_sn = 1; string client = 2; string channel = 3; + string openid = 4; } message QueryReq { diff --git a/rpc/payment/pb/payment.pb.go b/rpc/payment/pb/payment.pb.go index 732df15..64f406a 100644 --- a/rpc/payment/pb/payment.pb.go +++ b/rpc/payment/pb/payment.pb.go @@ -88,6 +88,7 @@ type PayReq struct { OrderSn string `protobuf:"bytes,1,opt,name=order_sn,json=orderSn,proto3" json:"order_sn,omitempty"` Client string `protobuf:"bytes,2,opt,name=client,proto3" json:"client,omitempty"` Channel string `protobuf:"bytes,3,opt,name=channel,proto3" json:"channel,omitempty"` + Openid string `protobuf:"bytes,4,opt,name=openid,proto3" json:"openid,omitempty"` // 小程序微信支付必传,当前微信会话的openid unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -143,6 +144,13 @@ func (x *PayReq) GetChannel() string { return "" } +func (x *PayReq) GetOpenid() string { + if x != nil { + return x.Openid + } + return "" +} + type QueryReq struct { state protoimpl.MessageState `protogen:"open.v1"` OrderSn string `protobuf:"bytes,1,opt,name=order_sn,json=orderSn,proto3" json:"order_sn,omitempty"` @@ -383,11 +391,12 @@ const file_payment_payment_proto_rawDesc = "" + "\bResponse\x12\x12\n" + "\x04code\x18\x01 \x01(\x05R\x04code\x12\x10\n" + "\x03msg\x18\x02 \x01(\tR\x03msg\x12\x12\n" + - "\x04data\x18\x03 \x01(\tR\x04data\"U\n" + + "\x04data\x18\x03 \x01(\tR\x04data\"m\n" + "\x06PayReq\x12\x19\n" + "\border_sn\x18\x01 \x01(\tR\aorderSn\x12\x16\n" + "\x06client\x18\x02 \x01(\tR\x06client\x12\x18\n" + - "\achannel\x18\x03 \x01(\tR\achannel\"?\n" + + "\achannel\x18\x03 \x01(\tR\achannel\x12\x16\n" + + "\x06openid\x18\x04 \x01(\tR\x06openid\"?\n" + "\bQueryReq\x12\x19\n" + "\border_sn\x18\x01 \x01(\tR\aorderSn\x12\x18\n" + "\achannel\x18\x02 \x01(\tR\achannel\"?\n" + @@ -405,13 +414,13 @@ const file_payment_payment_proto_rawDesc = "" + "\x04body\x18\x03 \x01(\fR\x04body\x1a:\n" + "\fHeadersEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x012\xa8\x03\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x012\x9e\x03\n" + "\aPayment\x12I\n" + "\x03Pay\x12\x0f.payment.PayReq\x1a\x11.payment.Response\"\x1e\x82\xd3\xe4\x93\x02\x18:\x01*\"\x13/api/v3/payment/pay\x12O\n" + "\x05Query\x12\x11.payment.QueryReq\x1a\x11.payment.Response\" \x82\xd3\xe4\x93\x02\x1a:\x01*\"\x15/api/v3/payment/query\x12O\n" + "\x05Close\x12\x11.payment.CloseReq\x1a\x11.payment.Response\" \x82\xd3\xe4\x93\x02\x1a:\x01*\"\x15/api/v3/payment/close\x12R\n" + - "\x06Refund\x12\x12.payment.RefundReq\x1a\x11.payment.Response\"!\x82\xd3\xe4\x93\x02\x1b:\x01*\"\x16/api/v3/payment/refund\x12\\\n" + - "\x06Notify\x12\x12.payment.NotifyReq\x1a\x11.payment.Response\"+\x82\xd3\xe4\x93\x02%:\x01*\" /api/v3/payment/notify/{channel}B\x1bZ\x19lone-services/rpc/paymentb\x06proto3" + "\x06Refund\x12\x12.payment.RefundReq\x1a\x11.payment.Response\"!\x82\xd3\xe4\x93\x02\x1b:\x01*\"\x16/api/v3/payment/refund\x12R\n" + + "\x06Notify\x12\x12.payment.NotifyReq\x1a\x11.payment.Response\"!\x82\xd3\xe4\x93\x02\x1b:\x01*\"\x16/api/v3/payment/notifyB\x1bZ\x19lone-services/rpc/paymentb\x06proto3" var ( file_payment_payment_proto_rawDescOnce sync.Once diff --git a/rpc/payment/pb/payment_grpc.pb.go b/rpc/payment/pb/payment_grpc.pb.go index ee1b468..f3a9064 100644 --- a/rpc/payment/pb/payment_grpc.pb.go +++ b/rpc/payment/pb/payment_grpc.pb.go @@ -30,15 +30,10 @@ const ( // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type PaymentClient interface { - // 发起支付 Pay(ctx context.Context, in *PayReq, opts ...grpc.CallOption) (*Response, error) - // 查询支付状态 Query(ctx context.Context, in *QueryReq, opts ...grpc.CallOption) (*Response, error) - // 关闭支付 Close(ctx context.Context, in *CloseReq, opts ...grpc.CallOption) (*Response, error) - // 退款 Refund(ctx context.Context, in *RefundReq, opts ...grpc.CallOption) (*Response, error) - // 支付回调(由 BFF/网关转发原始 body + headers) Notify(ctx context.Context, in *NotifyReq, opts ...grpc.CallOption) (*Response, error) } @@ -104,15 +99,10 @@ func (c *paymentClient) Notify(ctx context.Context, in *NotifyReq, opts ...grpc. // All implementations must embed UnimplementedPaymentServer // for forward compatibility. type PaymentServer interface { - // 发起支付 Pay(context.Context, *PayReq) (*Response, error) - // 查询支付状态 Query(context.Context, *QueryReq) (*Response, error) - // 关闭支付 Close(context.Context, *CloseReq) (*Response, error) - // 退款 Refund(context.Context, *RefundReq) (*Response, error) - // 支付回调(由 BFF/网关转发原始 body + headers) Notify(context.Context, *NotifyReq) (*Response, error) mustEmbedUnimplementedPaymentServer() } diff --git a/rpc/user/pb/user.pb.go b/rpc/user/pb/user.pb.go index 52d6a9b..1fc020a 100644 --- a/rpc/user/pb/user.pb.go +++ b/rpc/user/pb/user.pb.go @@ -1386,6 +1386,50 @@ func (x *InternalGetUserInfoData) GetCredentialType() string { return "" } +type GetOpenidReq struct { + state protoimpl.MessageState `protogen:"open.v1"` + Code string `protobuf:"bytes,1,opt,name=code,proto3" json:"code,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetOpenidReq) Reset() { + *x = GetOpenidReq{} + mi := &file_user_user_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetOpenidReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetOpenidReq) ProtoMessage() {} + +func (x *GetOpenidReq) ProtoReflect() protoreflect.Message { + mi := &file_user_user_proto_msgTypes[21] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetOpenidReq.ProtoReflect.Descriptor instead. +func (*GetOpenidReq) Descriptor() ([]byte, []int) { + return file_user_user_proto_rawDescGZIP(), []int{21} +} + +func (x *GetOpenidReq) GetCode() string { + if x != nil { + return x.Code + } + return "" +} + type InfoReq struct { state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields @@ -1394,7 +1438,7 @@ type InfoReq struct { func (x *InfoReq) Reset() { *x = InfoReq{} - mi := &file_user_user_proto_msgTypes[21] + mi := &file_user_user_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1406,7 +1450,7 @@ func (x *InfoReq) String() string { func (*InfoReq) ProtoMessage() {} func (x *InfoReq) ProtoReflect() protoreflect.Message { - mi := &file_user_user_proto_msgTypes[21] + mi := &file_user_user_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1419,7 +1463,7 @@ func (x *InfoReq) ProtoReflect() protoreflect.Message { // Deprecated: Use InfoReq.ProtoReflect.Descriptor instead. func (*InfoReq) Descriptor() ([]byte, []int) { - return file_user_user_proto_rawDescGZIP(), []int{21} + return file_user_user_proto_rawDescGZIP(), []int{22} } type ClientReq struct { @@ -1433,7 +1477,7 @@ type ClientReq struct { func (x *ClientReq) Reset() { *x = ClientReq{} - mi := &file_user_user_proto_msgTypes[22] + mi := &file_user_user_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1445,7 +1489,7 @@ func (x *ClientReq) String() string { func (*ClientReq) ProtoMessage() {} func (x *ClientReq) ProtoReflect() protoreflect.Message { - mi := &file_user_user_proto_msgTypes[22] + mi := &file_user_user_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1458,7 +1502,7 @@ func (x *ClientReq) ProtoReflect() protoreflect.Message { // Deprecated: Use ClientReq.ProtoReflect.Descriptor instead. func (*ClientReq) Descriptor() ([]byte, []int) { - return file_user_user_proto_rawDescGZIP(), []int{22} + return file_user_user_proto_rawDescGZIP(), []int{23} } func (x *ClientReq) GetName() string { @@ -1596,15 +1640,18 @@ const file_user_user_proto_rawDesc = "" + "\n" + "identifier\x18\b \x01(\tR\n" + "identifier\x12'\n" + - "\x0fcredential_type\x18\t \x01(\tR\x0ecredentialType\"\t\n" + + "\x0fcredential_type\x18\t \x01(\tR\x0ecredentialType\"\"\n" + + "\fGetOpenidReq\x12\x12\n" + + "\x04code\x18\x01 \x01(\tR\x04code\"\t\n" + "\aInfoReq\"V\n" + "\tClientReq\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\x12\x12\n" + "\x04type\x18\x02 \x01(\tR\x04type\x12!\n" + - "\fsubject_type\x18\x03 \x01(\rR\vsubjectType2\x90\b\n" + + "\fsubject_type\x18\x03 \x01(\rR\vsubjectType2\xe0\b\n" + "\x04User\x12A\n" + "\x05Login\x12\x0e.user.LoginReq\x1a\x0e.user.Response\"\x18\x82\xd3\xe4\x93\x02\x12:\x01*\"\r/api/v3/login\x12C\n" + - "\x04Info\x12\r.user.InfoReq\x1a\x0e.user.Response\"\x1c\x82\xd3\xe4\x93\x02\x16:\x01*\x12\x11/api/v3/user/info\x12K\n" + + "\x04Info\x12\r.user.InfoReq\x1a\x0e.user.Response\"\x1c\x82\xd3\xe4\x93\x02\x16:\x01*\x12\x11/api/v3/user/info\x12N\n" + + "\tGetOpenid\x12\x12.user.GetOpenidReq\x1a\x0e.user.Response\"\x1d\x82\xd3\xe4\x93\x02\x17:\x01*\"\x12/api/v3/getuseroid\x12K\n" + "\x06Client\x12\x0f.user.ClientReq\x1a\x0e.user.Response\" \x82\xd3\xe4\x93\x02\x1a:\x01*\x12\x15/admin/v3/user/client\x12P\n" + "\tUserItems\x12\x12.user.UserItemsReq\x1a\x0e.user.Response\"\x1f\x82\xd3\xe4\x93\x02\x19:\x01*\x12\x14/admin/v3/user/items\x12S\n" + "\n" + @@ -1630,7 +1677,7 @@ func file_user_user_proto_rawDescGZIP() []byte { return file_user_user_proto_rawDescData } -var file_user_user_proto_msgTypes = make([]protoimpl.MessageInfo, 23) +var file_user_user_proto_msgTypes = make([]protoimpl.MessageInfo, 24) var file_user_user_proto_goTypes = []any{ (*Response)(nil), // 0: user.Response (*LoginReq)(nil), // 1: user.LoginReq @@ -1653,39 +1700,42 @@ var file_user_user_proto_goTypes = []any{ (*InternalUpdateData)(nil), // 18: user.InternalUpdateData (*InternalGetUserInfoReq)(nil), // 19: user.InternalGetUserInfoReq (*InternalGetUserInfoData)(nil), // 20: user.InternalGetUserInfoData - (*InfoReq)(nil), // 21: user.InfoReq - (*ClientReq)(nil), // 22: user.ClientReq + (*GetOpenidReq)(nil), // 21: user.GetOpenidReq + (*InfoReq)(nil), // 22: user.InfoReq + (*ClientReq)(nil), // 23: user.ClientReq } var file_user_user_proto_depIdxs = []int32{ 7, // 0: user.InternalUsersByIdsData.items:type_name -> user.UserBriefItem 1, // 1: user.User.Login:input_type -> user.LoginReq - 21, // 2: user.User.Info:input_type -> user.InfoReq - 22, // 3: user.User.Client:input_type -> user.ClientReq - 2, // 4: user.User.UserItems:input_type -> user.UserItemsReq - 3, // 5: user.User.UserStatus:input_type -> user.UserStatusReq - 4, // 6: user.User.InternalCreate:input_type -> user.InternalCreateReq - 13, // 7: user.User.InternalCheckCreate:input_type -> user.InternalCheckCreateReq - 15, // 8: user.User.InternalCheckUpdate:input_type -> user.InternalCheckUpdateReq - 17, // 9: user.User.InternalUpdate:input_type -> user.InternalUpdateReq - 6, // 10: user.User.InternalUsersByIds:input_type -> user.InternalUsersByIdsReq - 9, // 11: user.User.InternalUpdateMobile:input_type -> user.InternalUpdateMobileReq - 11, // 12: user.User.InternalRevokeBizClient:input_type -> user.InternalRevokeBizClientReq - 19, // 13: user.User.InternalGetUserInfo:input_type -> user.InternalGetUserInfoReq - 0, // 14: user.User.Login:output_type -> user.Response - 0, // 15: user.User.Info:output_type -> user.Response - 0, // 16: user.User.Client:output_type -> user.Response - 0, // 17: user.User.UserItems:output_type -> user.Response - 0, // 18: user.User.UserStatus:output_type -> user.Response - 5, // 19: user.User.InternalCreate:output_type -> user.InternalCreateData - 14, // 20: user.User.InternalCheckCreate:output_type -> user.InternalCheckCreateData - 16, // 21: user.User.InternalCheckUpdate:output_type -> user.InternalCheckUpdateData - 18, // 22: user.User.InternalUpdate:output_type -> user.InternalUpdateData - 8, // 23: user.User.InternalUsersByIds:output_type -> user.InternalUsersByIdsData - 10, // 24: user.User.InternalUpdateMobile:output_type -> user.InternalUpdateMobileData - 12, // 25: user.User.InternalRevokeBizClient:output_type -> user.InternalRevokeBizClientData - 20, // 26: user.User.InternalGetUserInfo:output_type -> user.InternalGetUserInfoData - 14, // [14:27] is the sub-list for method output_type - 1, // [1:14] is the sub-list for method input_type + 22, // 2: user.User.Info:input_type -> user.InfoReq + 21, // 3: user.User.GetOpenid:input_type -> user.GetOpenidReq + 23, // 4: user.User.Client:input_type -> user.ClientReq + 2, // 5: user.User.UserItems:input_type -> user.UserItemsReq + 3, // 6: user.User.UserStatus:input_type -> user.UserStatusReq + 4, // 7: user.User.InternalCreate:input_type -> user.InternalCreateReq + 13, // 8: user.User.InternalCheckCreate:input_type -> user.InternalCheckCreateReq + 15, // 9: user.User.InternalCheckUpdate:input_type -> user.InternalCheckUpdateReq + 17, // 10: user.User.InternalUpdate:input_type -> user.InternalUpdateReq + 6, // 11: user.User.InternalUsersByIds:input_type -> user.InternalUsersByIdsReq + 9, // 12: user.User.InternalUpdateMobile:input_type -> user.InternalUpdateMobileReq + 11, // 13: user.User.InternalRevokeBizClient:input_type -> user.InternalRevokeBizClientReq + 19, // 14: user.User.InternalGetUserInfo:input_type -> user.InternalGetUserInfoReq + 0, // 15: user.User.Login:output_type -> user.Response + 0, // 16: user.User.Info:output_type -> user.Response + 0, // 17: user.User.GetOpenid:output_type -> user.Response + 0, // 18: user.User.Client:output_type -> user.Response + 0, // 19: user.User.UserItems:output_type -> user.Response + 0, // 20: user.User.UserStatus:output_type -> user.Response + 5, // 21: user.User.InternalCreate:output_type -> user.InternalCreateData + 14, // 22: user.User.InternalCheckCreate:output_type -> user.InternalCheckCreateData + 16, // 23: user.User.InternalCheckUpdate:output_type -> user.InternalCheckUpdateData + 18, // 24: user.User.InternalUpdate:output_type -> user.InternalUpdateData + 8, // 25: user.User.InternalUsersByIds:output_type -> user.InternalUsersByIdsData + 10, // 26: user.User.InternalUpdateMobile:output_type -> user.InternalUpdateMobileData + 12, // 27: user.User.InternalRevokeBizClient:output_type -> user.InternalRevokeBizClientData + 20, // 28: user.User.InternalGetUserInfo:output_type -> user.InternalGetUserInfoData + 15, // [15:29] is the sub-list for method output_type + 1, // [1:15] is the sub-list for method input_type 1, // [1:1] is the sub-list for extension type_name 1, // [1:1] is the sub-list for extension extendee 0, // [0:1] is the sub-list for field type_name @@ -1702,7 +1752,7 @@ func file_user_user_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_user_user_proto_rawDesc), len(file_user_user_proto_rawDesc)), NumEnums: 0, - NumMessages: 23, + NumMessages: 24, NumExtensions: 0, NumServices: 1, }, diff --git a/rpc/user/pb/user_grpc.pb.go b/rpc/user/pb/user_grpc.pb.go index a667bd7..c469bab 100644 --- a/rpc/user/pb/user_grpc.pb.go +++ b/rpc/user/pb/user_grpc.pb.go @@ -8,7 +8,6 @@ package user import ( context "context" - grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" @@ -22,6 +21,7 @@ const _ = grpc.SupportPackageIsVersion9 const ( User_Login_FullMethodName = "/user.User/Login" User_Info_FullMethodName = "/user.User/Info" + User_GetOpenid_FullMethodName = "/user.User/GetOpenid" User_Client_FullMethodName = "/user.User/Client" User_UserItems_FullMethodName = "/user.User/UserItems" User_UserStatus_FullMethodName = "/user.User/UserStatus" @@ -41,6 +41,7 @@ const ( type UserClient interface { Login(ctx context.Context, in *LoginReq, opts ...grpc.CallOption) (*Response, error) Info(ctx context.Context, in *InfoReq, opts ...grpc.CallOption) (*Response, error) + GetOpenid(ctx context.Context, in *GetOpenidReq, opts ...grpc.CallOption) (*Response, error) Client(ctx context.Context, in *ClientReq, opts ...grpc.CallOption) (*Response, error) UserItems(ctx context.Context, in *UserItemsReq, opts ...grpc.CallOption) (*Response, error) UserStatus(ctx context.Context, in *UserStatusReq, opts ...grpc.CallOption) (*Response, error) @@ -82,6 +83,16 @@ func (c *userClient) Info(ctx context.Context, in *InfoReq, opts ...grpc.CallOpt return out, nil } +func (c *userClient) GetOpenid(ctx context.Context, in *GetOpenidReq, opts ...grpc.CallOption) (*Response, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(Response) + err := c.cc.Invoke(ctx, User_GetOpenid_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *userClient) Client(ctx context.Context, in *ClientReq, opts ...grpc.CallOption) (*Response, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(Response) @@ -198,6 +209,7 @@ func (c *userClient) InternalGetUserInfo(ctx context.Context, in *InternalGetUse type UserServer interface { Login(context.Context, *LoginReq) (*Response, error) Info(context.Context, *InfoReq) (*Response, error) + GetOpenid(context.Context, *GetOpenidReq) (*Response, error) Client(context.Context, *ClientReq) (*Response, error) UserItems(context.Context, *UserItemsReq) (*Response, error) UserStatus(context.Context, *UserStatusReq) (*Response, error) @@ -225,6 +237,9 @@ func (UnimplementedUserServer) Login(context.Context, *LoginReq) (*Response, err func (UnimplementedUserServer) Info(context.Context, *InfoReq) (*Response, error) { return nil, status.Error(codes.Unimplemented, "method Info not implemented") } +func (UnimplementedUserServer) GetOpenid(context.Context, *GetOpenidReq) (*Response, error) { + return nil, status.Error(codes.Unimplemented, "method GetOpenid not implemented") +} func (UnimplementedUserServer) Client(context.Context, *ClientReq) (*Response, error) { return nil, status.Error(codes.Unimplemented, "method Client not implemented") } @@ -315,6 +330,24 @@ func _User_Info_Handler(srv interface{}, ctx context.Context, dec func(interface return interceptor(ctx, in, info, handler) } +func _User_GetOpenid_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetOpenidReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServer).GetOpenid(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: User_GetOpenid_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServer).GetOpenid(ctx, req.(*GetOpenidReq)) + } + return interceptor(ctx, in, info, handler) +} + func _User_Client_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ClientReq) if err := dec(in); err != nil { @@ -528,6 +561,10 @@ var User_ServiceDesc = grpc.ServiceDesc{ MethodName: "Info", Handler: _User_Info_Handler, }, + { + MethodName: "GetOpenid", + Handler: _User_GetOpenid_Handler, + }, { MethodName: "Client", Handler: _User_Client_Handler, diff --git a/rpc/user/user.pb b/rpc/user/user.pb index bfc75fb..fea0cb9 100644 Binary files a/rpc/user/user.pb and b/rpc/user/user.pb differ diff --git a/rpc/user/user.proto b/rpc/user/user.proto index 26e95cd..b7fadd8 100644 --- a/rpc/user/user.proto +++ b/rpc/user/user.proto @@ -144,6 +144,10 @@ message InternalGetUserInfoData { string credential_type = 9; } +message GetOpenidReq { + string code = 1; +} + message InfoReq {} message ClientReq { @@ -165,6 +169,12 @@ service User { body: "*" }; } + rpc GetOpenid(GetOpenidReq) returns (Response) { + option (google.api.http) = { + post: "/api/v3/getuseroid" + body: "*" + }; + } rpc Client(ClientReq) returns (Response) { option (google.api.http) = { get: "/admin/v3/user/client" diff --git a/services/payment/internal/logic/payLogic.go b/services/payment/internal/logic/payLogic.go index 99b4456..5da131c 100644 --- a/services/payment/internal/logic/payLogic.go +++ b/services/payment/internal/logic/payLogic.go @@ -78,12 +78,13 @@ func (l *PayLogic) Pay(in *payment.PayReq) (*payment.Response, error) { switch channelCode { case pkgpay.ChannelWechat: - openid, oErr := loadOpenID(l.ctx, l.svcCtx.UserSvcName, loginUser.ID) - if oErr != nil || openid == utils.StringEmpty { - l.Errorf("pay openid: %v", oErr) - return outResponse(utils.Fail, "未绑定微信openid"), nil + if client == pkgpay.ClientApp { + break } - prepayReq.OpenID = openid + if in.Openid == utils.StringEmpty { + return outResponse(utils.ErrorParams, "openid不能为空"), nil + } + prepayReq.OpenID = in.Openid case pkgpay.ChannelAlipay, pkgpay.ChannelBank: return outResponse(utils.Fail, "支付渠道暂未开通"), nil } diff --git a/services/payment/internal/logic/userRpc.go b/services/payment/internal/logic/userRpc.go deleted file mode 100644 index 3d0f6e9..0000000 --- a/services/payment/internal/logic/userRpc.go +++ /dev/null @@ -1,35 +0,0 @@ -package logic - -import ( - "context" - "fmt" - - "lone-services/pkg/utils" - userpb "lone-services/rpc/user/pb" - "lone-services/services/payment/internal/svc" -) - -func loadOpenID(ctx context.Context, userSvcName string, userID int64) (string, error) { - if userSvcName == utils.StringEmpty { - return utils.StringEmpty, fmt.Errorf("user service not configured") - } - if userID < utils.NumberOne { - return utils.StringEmpty, fmt.Errorf("invalid user id") - } - - cli, err := svc.GetRpcClient(userSvcName) - if err != nil { - return utils.StringEmpty, err - } - info, err := userpb.NewUserClient(cli.Conn()).InternalGetUserInfo(ctx, &userpb.InternalGetUserInfoReq{ - UserId: userID, - CredentialType: "openid", - }) - if err != nil { - return utils.StringEmpty, err - } - if info == nil || info.Identifier == utils.StringEmpty { - return utils.StringEmpty, fmt.Errorf("openid credential not found") - } - return info.Identifier, nil -} diff --git a/services/payment/internal/server/paymentServer.go b/services/payment/internal/server/paymentServer.go index 7d39eb9..506117d 100644 --- a/services/payment/internal/server/paymentServer.go +++ b/services/payment/internal/server/paymentServer.go @@ -7,7 +7,7 @@ package server import ( "context" - "lone-services/rpc/payment/pb" + payment "lone-services/rpc/payment/pb" "lone-services/services/payment/internal/logic" "lone-services/services/payment/internal/svc" ) @@ -23,31 +23,26 @@ func NewPaymentServer(svcCtx *svc.ServiceContext) *PaymentServer { } } -// 发起支付 func (s *PaymentServer) Pay(ctx context.Context, in *payment.PayReq) (*payment.Response, error) { l := logic.NewPayLogic(ctx, s.svcCtx) return l.Pay(in) } -// 查询支付状态 func (s *PaymentServer) Query(ctx context.Context, in *payment.QueryReq) (*payment.Response, error) { l := logic.NewQueryLogic(ctx, s.svcCtx) return l.Query(in) } -// 关闭支付 func (s *PaymentServer) Close(ctx context.Context, in *payment.CloseReq) (*payment.Response, error) { l := logic.NewCloseLogic(ctx, s.svcCtx) return l.Close(in) } -// 退款 func (s *PaymentServer) Refund(ctx context.Context, in *payment.RefundReq) (*payment.Response, error) { l := logic.NewRefundLogic(ctx, s.svcCtx) return l.Refund(in) } -// 支付回调(由 BFF/网关转发原始 body + headers) func (s *PaymentServer) Notify(ctx context.Context, in *payment.NotifyReq) (*payment.Response, error) { l := logic.NewNotifyLogic(ctx, s.svcCtx) return l.Notify(in) diff --git a/services/payment/paymentclient/payment.go b/services/payment/paymentclient/payment.go index 82362ab..f1442be 100644 --- a/services/payment/paymentclient/payment.go +++ b/services/payment/paymentclient/payment.go @@ -22,15 +22,10 @@ type ( Response = payment.Response Payment interface { - // 发起支付 Pay(ctx context.Context, in *PayReq, opts ...grpc.CallOption) (*Response, error) - // 查询支付状态 Query(ctx context.Context, in *QueryReq, opts ...grpc.CallOption) (*Response, error) - // 关闭支付 Close(ctx context.Context, in *CloseReq, opts ...grpc.CallOption) (*Response, error) - // 退款 Refund(ctx context.Context, in *RefundReq, opts ...grpc.CallOption) (*Response, error) - // 支付回调(由 BFF/网关转发原始 body + headers) Notify(ctx context.Context, in *NotifyReq, opts ...grpc.CallOption) (*Response, error) } @@ -45,31 +40,26 @@ func NewPayment(cli zrpc.Client) Payment { } } -// 发起支付 func (m *defaultPayment) Pay(ctx context.Context, in *PayReq, opts ...grpc.CallOption) (*Response, error) { client := payment.NewPaymentClient(m.cli.Conn()) return client.Pay(ctx, in, opts...) } -// 查询支付状态 func (m *defaultPayment) Query(ctx context.Context, in *QueryReq, opts ...grpc.CallOption) (*Response, error) { client := payment.NewPaymentClient(m.cli.Conn()) return client.Query(ctx, in, opts...) } -// 关闭支付 func (m *defaultPayment) Close(ctx context.Context, in *CloseReq, opts ...grpc.CallOption) (*Response, error) { client := payment.NewPaymentClient(m.cli.Conn()) return client.Close(ctx, in, opts...) } -// 退款 func (m *defaultPayment) Refund(ctx context.Context, in *RefundReq, opts ...grpc.CallOption) (*Response, error) { client := payment.NewPaymentClient(m.cli.Conn()) return client.Refund(ctx, in, opts...) } -// 支付回调(由 BFF/网关转发原始 body + headers) func (m *defaultPayment) Notify(ctx context.Context, in *NotifyReq, opts ...grpc.CallOption) (*Response, error) { client := payment.NewPaymentClient(m.cli.Conn()) return client.Notify(ctx, in, opts...) diff --git a/services/user/internal/dao/session.go b/services/user/internal/dao/session.go index ab5ad62..62e0e38 100644 --- a/services/user/internal/dao/session.go +++ b/services/user/internal/dao/session.go @@ -6,6 +6,11 @@ type Token struct { Info UserLoginSession `json:"info"` } +type OpenidResult struct { + Openid string `json:"openid"` + Unionid string `json:"unionid"` +} + type UserLoginSession struct { Id int64 `json:"id"` Name string `json:"name"` diff --git a/services/user/internal/logic/getOpenidLogic.go b/services/user/internal/logic/getOpenidLogic.go new file mode 100644 index 0000000..b3af848 --- /dev/null +++ b/services/user/internal/logic/getOpenidLogic.go @@ -0,0 +1,66 @@ +package logic + +import ( + "context" + + "lone-services/pkg/utils" + "lone-services/pkg/validate" + user "lone-services/rpc/user/pb" + userconfig "lone-services/services/user/internal/config" + "lone-services/services/user/internal/dao" + "lone-services/services/user/internal/svc" + "lone-services/services/user/validator" + + "github.com/zeromicro/go-zero/core/logx" +) + +type GetOpenidLogic struct { + ctx context.Context + svcCtx *svc.ServiceContext + logx.Logger +} + +func NewGetOpenidLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetOpenidLogic { + return &GetOpenidLogic{ + ctx: ctx, + svcCtx: svcCtx, + Logger: logx.WithContext(ctx), + } +} + +func (l *GetOpenidLogic) GetOpenid(in *user.GetOpenidReq) (*user.Response, error) { + loginUser := utils.GetUserFromCtx(l.ctx) + if loginUser.ID < utils.NumberOne { + return failResponse(utils.ErrorNoLoginInfo), nil + } + + var req validator.GetOpenidValidator + if msg := validate.ValidateFromProto(in, &req); msg != utils.StringEmpty { + return outResponse(utils.ErrorParams, msg), nil + } + if loginUser.ClientCode == utils.StringEmpty { + return outResponse(utils.ErrorParams, "端编码不能为空"), nil + } + + if _, err := loadEnabledClient(loginUser.ClientCode); err != nil { + l.Errorf("get openid load client: %v", err) + return failResponse(utils.Fail), nil + } + + wxClient, cfgErr := userconfig.NewWechatClient(loginUser.ClientCode) + if cfgErr != nil { + l.Errorf("get openid wechat config: %v", cfgErr) + return outResponse(utils.Fail, "微信配置缺失"), nil + } + + session, wxErr := wxClient.Code2Session(req.Code) + if wxErr != nil { + l.Errorf("get openid code2session: %v", wxErr) + return outResponse(utils.Fail, "获取openid失败"), nil + } + + return okResponse(dao.OpenidResult{ + Openid: session.OpenID, + Unionid: session.UnionID, + }), nil +} diff --git a/services/user/internal/server/userServer.go b/services/user/internal/server/userServer.go index f4dafcb..8dfddde 100644 --- a/services/user/internal/server/userServer.go +++ b/services/user/internal/server/userServer.go @@ -33,6 +33,11 @@ func (s *UserServer) Info(ctx context.Context, in *user.InfoReq) (*user.Response return l.Info(in) } +func (s *UserServer) GetOpenid(ctx context.Context, in *user.GetOpenidReq) (*user.Response, error) { + l := logic.NewGetOpenidLogic(ctx, s.svcCtx) + return l.GetOpenid(in) +} + func (s *UserServer) Client(ctx context.Context, in *user.ClientReq) (*user.Response, error) { l := logic.NewClientLogic(ctx, s.svcCtx) return l.Client(in) diff --git a/services/user/userClient/user.go b/services/user/userClient/user.go index 18e2569..91c6a0c 100644 --- a/services/user/userClient/user.go +++ b/services/user/userClient/user.go @@ -15,6 +15,7 @@ import ( type ( ClientReq = user.ClientReq + GetOpenidReq = user.GetOpenidReq InfoReq = user.InfoReq InternalCheckCreateData = user.InternalCheckCreateData InternalCheckCreateReq = user.InternalCheckCreateReq @@ -41,6 +42,7 @@ type ( User interface { Login(ctx context.Context, in *LoginReq, opts ...grpc.CallOption) (*Response, error) Info(ctx context.Context, in *InfoReq, opts ...grpc.CallOption) (*Response, error) + GetOpenid(ctx context.Context, in *GetOpenidReq, opts ...grpc.CallOption) (*Response, error) Client(ctx context.Context, in *ClientReq, opts ...grpc.CallOption) (*Response, error) UserItems(ctx context.Context, in *UserItemsReq, opts ...grpc.CallOption) (*Response, error) UserStatus(ctx context.Context, in *UserStatusReq, opts ...grpc.CallOption) (*Response, error) @@ -75,6 +77,11 @@ func (m *defaultUser) Info(ctx context.Context, in *InfoReq, opts ...grpc.CallOp return client.Info(ctx, in, opts...) } +func (m *defaultUser) GetOpenid(ctx context.Context, in *GetOpenidReq, opts ...grpc.CallOption) (*Response, error) { + client := user.NewUserClient(m.cli.Conn()) + return client.GetOpenid(ctx, in, opts...) +} + func (m *defaultUser) Client(ctx context.Context, in *ClientReq, opts ...grpc.CallOption) (*Response, error) { client := user.NewUserClient(m.cli.Conn()) return client.Client(ctx, in, opts...) diff --git a/services/user/validator/user.go b/services/user/validator/user.go index 5784670..11bea4b 100644 --- a/services/user/validator/user.go +++ b/services/user/validator/user.go @@ -24,6 +24,17 @@ func (p LoginValidator) GetMessage() validate.ValidatorMessages { } } +type GetOpenidValidator struct { + Code string `validate:"required,max=128"` +} + +func (p GetOpenidValidator) GetMessage() validate.ValidatorMessages { + return validate.ValidatorMessages{ + "Code.required": "Code 不能为空", + "Code.max": "Code 过长", + } +} + type UserItemsValidator struct { Mobile string Page int32 `validate:"omitempty,min=1"`