
1package main
2
3import (
4 "bytes"
5 "demo/wxpay_utility"
6 "encoding/json"
7 "fmt"
8 "net/http"
9 "net/url"
10)
11
12func main() {
13
14 config, err := wxpay_utility.CreateMchConfig(
15 "19xxxxxxxx",
16 "1DDE55AD98Exxxxxxxxxx",
17 "/path/to/apiclient_key.pem",
18 "PUB_KEY_ID_xxxxxxxxxxxxx",
19 "/path/to/wxp_pub.pem",
20 )
21 if err != nil {
22 fmt.Println(err)
23 return
24 }
25
26 request := &TerminateContractByCodeRequest{
27 OutContractCode: wxpay_utility.String("WxCreditRepayment20200910100000"),
28 ContractTerminationRemark: wxpay_utility.String("签约信息有误,需解约然后重新签约"),
29 }
30
31 response, err := PartnerTerminateContractByCode(config, request)
32 if err != nil {
33 fmt.Printf("请求失败: %+v\n", err)
34
35 return
36 }
37
38
39 fmt.Printf("请求成功: %+v\n", response)
40}
41
42func PartnerTerminateContractByCode(config *wxpay_utility.MchConfig, request *TerminateContractByCodeRequest) (response *TerminateContractByCodeResponse, err error) {
43 const (
44 host = "https://api.mch.weixin.qq.com"
45 method = "POST"
46 path = "/v3/credit-repayment/partner/contracts/terminate"
47 )
48
49 reqUrl, err := url.Parse(fmt.Sprintf("%s%s", host, path))
50 if err != nil {
51 return nil, err
52 }
53 reqBody, err := json.Marshal(request)
54 if err != nil {
55 return nil, err
56 }
57 httpRequest, err := http.NewRequest(method, reqUrl.String(), bytes.NewReader(reqBody))
58 if err != nil {
59 return nil, err
60 }
61 httpRequest.Header.Set("Accept", "application/json")
62 httpRequest.Header.Set("Wechatpay-Serial", config.WechatPayPublicKeyId())
63 httpRequest.Header.Set("Content-Type", "application/json")
64 authorization, err := wxpay_utility.BuildAuthorization(config.MchId(), config.CertificateSerialNo(), config.PrivateKey(), method, reqUrl.RequestURI(), reqBody)
65 if err != nil {
66 return nil, err
67 }
68 httpRequest.Header.Set("Authorization", authorization)
69
70 client := &http.Client{}
71 httpResponse, err := client.Do(httpRequest)
72 if err != nil {
73 return nil, err
74 }
75 respBody, err := wxpay_utility.ExtractResponseBody(httpResponse)
76 if err != nil {
77 return nil, err
78 }
79 if httpResponse.StatusCode >= 200 && httpResponse.StatusCode < 300 {
80
81 err = wxpay_utility.ValidateResponse(
82 config.WechatPayPublicKeyId(),
83 config.WechatPayPublicKey(),
84 &httpResponse.Header,
85 respBody,
86 )
87 if err != nil {
88 return nil, err
89 }
90 response := &TerminateContractByCodeResponse{}
91 if err := json.Unmarshal(respBody, response); err != nil {
92 return nil, err
93 }
94
95 return response, nil
96 } else {
97 return nil, wxpay_utility.NewApiException(
98 httpResponse.StatusCode,
99 httpResponse.Header,
100 respBody,
101 )
102 }
103}
104
105type TerminateContractByCodeRequest struct {
106 OutContractCode *string `json:"out_contract_code,omitempty"`
107 ContractTerminationRemark *string `json:"contract_termination_remark,omitempty"`
108}
109
110type TerminateContractByCodeResponse struct {
111 ContractInfo *Contract `json:"contract_info,omitempty"`
112}
113
114type Contract struct {
115 ContractId *string `json:"contract_id,omitempty"`
116 PlanId *string `json:"plan_id,omitempty"`
117 OutContractCode *string `json:"out_contract_code,omitempty"`
118 DisplayName *string `json:"display_name,omitempty"`
119 ContractState *ContractState `json:"contract_state,omitempty"`
120 ContractSignedTime *string `json:"contract_signed_time,omitempty"`
121 ContractTerminatedTime *string `json:"contract_terminated_time,omitempty"`
122 ContractTerminatedMode *TerminationMode `json:"contract_terminated_mode,omitempty"`
123 ContractTerminationRemark *string `json:"contract_termination_remark,omitempty"`
124 RepaymentDay *int64 `json:"repayment_day,omitempty"`
125 Openid *string `json:"openid,omitempty"`
126 Appid *string `json:"appid,omitempty"`
127 RepaymentAmountLimit *string `json:"repayment_amount_limit,omitempty"`
128}
129
130type ContractState string
131
132func (e ContractState) Ptr() *ContractState {
133 return &e
134}
135
136const (
137 CONTRACTSTATE_CONTRACT_STATE_INVALID ContractState = "CONTRACT_STATE_INVALID"
138 CONTRACTSTATE_CONTRACT_STATE_EFFECTIVE ContractState = "CONTRACT_STATE_EFFECTIVE"
139 CONTRACTSTATE_CONTRACT_STATE_TERMINATED ContractState = "CONTRACT_STATE_TERMINATED"
140)
141
142type TerminationMode string
143
144func (e TerminationMode) Ptr() *TerminationMode {
145 return &e
146}
147
148const (
149 TERMINATIONMODE_TERMINATION_MODE_INVALID TerminationMode = "TERMINATION_MODE_INVALID"
150 TERMINATIONMODE_TERMINATION_MODE_BY_USER TerminationMode = "TERMINATION_MODE_BY_USER"
151 TERMINATIONMODE_TERMINATION_MODE_BY_MERCHANT TerminationMode = "TERMINATION_MODE_BY_MERCHANT"
152 TERMINATIONMODE_TERMINATION_MODE_BY_CUSTOMER_SERVICE TerminationMode = "TERMINATION_MODE_BY_CUSTOMER_SERVICE"
153)
154