### Go Implementation for ListComplaintsV2 Source: https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter6_2_5.shtml A complete Go example demonstrating how to configure the merchant client and perform a GET request to the Complaints V2 endpoint. ```go package main import ( "demo/wxpay_utility" // 引用微信支付工具库,参考 https://pay.weixin.qq.com/doc/v3/merchant/4015119334 "encoding/json" "fmt" "net/http" "net/url" ) func main() { // TODO: 请准备商户开发必要参数,参考:https://pay.weixin.qq.com/doc/v3/merchant/4013070756 config, err := wxpay_utility.CreateMchConfig( "19xxxxxxxx", // 商户号,是由微信支付系统生成并分配给每个商户的唯一标识符,商户号获取方式参考 https://pay.weixin.qq.com/doc/v3/merchant/4013070756 "1DDE55AD98Exxxxxxxxxx", // 商户API证书序列号,如何获取请参考 https://pay.weixin.qq.com/doc/v3/merchant/4013053053 "/path/to/apiclient_key.pem", // 商户API证书私钥文件路径,本地文件路径 "PUB_KEY_ID_xxxxxxxxxxxxx", // 微信支付公钥ID,如何获取请参考 https://pay.weixin.qq.com/doc/v3/merchant/4013038816 "/path/to/wxp_pub.pem", // 微信支付公钥文件路径,本地文件路径 ) if err != nil { fmt.Println(err) return } request := &ListComplaintsV2Request{ Limit: wxpay_utility.Int64(5), Offset: wxpay_utility.Int64(10), BeginDate: wxpay_utility.String("2019-01-01"), EndDate: wxpay_utility.String("2019-01-01"), ComplaintedMchid: wxpay_utility.String("1900012181"), } response, err := ListComplaintsV2(config, request) if err != nil { fmt.Printf("请求失败: %+v\n", err) // TODO: 请求失败,根据状态码执行不同的处理 return } // TODO: 请求成功,继续业务逻辑 fmt.Printf("请求成功: %+v\n", response) } func ListComplaintsV2(config *wxpay_utility.MchConfig, request *ListComplaintsV2Request) (response *ListComplaintsV2Response, err error) { const ( host = "https://api.mch.weixin.qq.com" method = "GET" path = "/v3/merchant-service/complaints-v2" ) reqUrl, err := url.Parse(fmt.Sprintf("%s%s", host, path)) if err != nil { return nil, err } query := reqUrl.Query() if request.Limit != nil { query.Add("limit", fmt.Sprintf("%v", *request.Limit)) } if request.Offset != nil { query.Add("offset", fmt.Sprintf("%v", *request.Offset)) } if request.BeginDate != nil { query.Add("begin_date", *request.BeginDate) } if request.EndDate != nil { query.Add("end_date", *request.EndDate) } if request.ComplaintedMchid != nil { query.Add("complainted_mchid", *request.ComplaintedMchid) } reqUrl.RawQuery = query.Encode() httpRequest, err := http.NewRequest(method, reqUrl.String(), nil) if err != nil { return nil, err } httpRequest.Header.Set("Accept", "application/json") httpRequest.Header.Set("Wechatpay-Serial", config.WechatPayPublicKeyId()) authorization, err := wxpay_utility.BuildAuthorization(config.MchId(), config.CertificateSerialNo(), config.PrivateKey(), method, reqUrl.RequestURI(), nil) if err != nil { return nil, err } httpRequest.Header.Set("Authorization", authorization) client := &http.Client{} httpResponse, err := client.Do(httpRequest) if err != nil { return nil, err } respBody, err := wxpay_utility.ExtractResponseBody(httpResponse) if err != nil { return nil, err } if httpResponse.StatusCode >= 200 && httpResponse.StatusCode < 300 { // 2XX 成功,验证应答签名 err = wxpay_utility.ValidateResponse( config.WechatPayPublicKeyId(), config.WechatPayPublicKey(), &httpResponse.Header, respBody, ) if err != nil { return nil, err } response := &ListComplaintsV2Response{} if err := json.Unmarshal(respBody, response); err != nil { return nil, err } return response, nil } else { return nil, wxpay_utility.NewApiException( httpResponse.StatusCode, httpResponse.Header, respBody, ) } } type ListComplaintsV2Request struct { Limit *int64 `json:"limit,omitempty"` Offset *int64 `json:"offset,omitempty"` ``` -------------------------------- ### Query Smart Guides API Implementation Source: https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter3_4_7.shtml This snippet demonstrates how to construct the request, execute the HTTP call, and validate the response signature for the Smart Guide list API. ```go 30 Limit: wxpay_utility.Int64(5), 31 Offset: wxpay_utility.Int64(0), 32 } 33 34 response, err := ListGuides(config, request) 35 if err != nil { 36 fmt.Printf("请求失败: %+v\n", err) 37 // TODO: 请求失败,根据状态码执行不同的处理 38 return 39 } 40 41 // TODO: 请求成功,继续业务逻辑 42 fmt.Printf("请求成功: %+v\n", response) 43} 44 45func ListGuides(config *wxpay_utility.MchConfig, request *ListGuidesRequest) (response *ListGuidesResponse, err error) { 46 const ( 47 host = "https://api.mch.weixin.qq.com" 48 method = "GET" 49 path = "/v3/smartguide/guides" 50 ) 51 52 reqUrl, err := url.Parse(fmt.Sprintf("%s%s", host, path)) 53 if err != nil { 54 return nil, err 55 } 56 query := reqUrl.Query() 57 if request.StoreId != nil { 58 query.Add("store_id", fmt.Sprintf("%v", *request.StoreId)) 59 } 60 if request.Userid != nil { 61 query.Add("userid", *request.Userid) 62 } 63 if request.Mobile != nil { 64 query.Add("mobile", *request.Mobile) 65 } 66 if request.WorkId != nil { 67 query.Add("work_id", *request.WorkId) 68 } 69 if request.Limit != nil { 70 query.Add("limit", fmt.Sprintf("%v", *request.Limit)) 71 } 72 if request.Offset != nil { 73 query.Add("offset", fmt.Sprintf("%v", *request.Offset)) 74 } 75 reqUrl.RawQuery = query.Encode() 76 httpRequest, err := http.NewRequest(method, reqUrl.String(), nil) 77 if err != nil { 78 return nil, err 79 } 80 httpRequest.Header.Set("Accept", "application/json") 81 httpRequest.Header.Set("Wechatpay-Serial", config.WechatPayPublicKeyId()) 82 authorization, err := wxpay_utility.BuildAuthorization(config.MchId(), config.CertificateSerialNo(), config.PrivateKey(), method, reqUrl.RequestURI(), nil) 83 if err != nil { 84 return nil, err 85 } 86 httpRequest.Header.Set("Authorization", authorization) 87 88 client := &http.Client{} 89 httpResponse, err := client.Do(httpRequest) 90 if err != nil { 91 return nil, err 92 } 93 respBody, err := wxpay_utility.ExtractResponseBody(httpResponse) 94 if err != nil { 95 return nil, err 96 } 97 if httpResponse.StatusCode >= 200 && httpResponse.StatusCode < 300 { 98 // 2XX 成功,验证应答签名 99 err = wxpay_utility.ValidateResponse( 100 config.WechatPayPublicKeyId(), 101 config.WechatPayPublicKey(), 102 &httpResponse.Header, 103 respBody, 104 ) 105 if err != nil { 106 return nil, err 107 } 108 response := &ListGuidesResponse{} 109 if err := json.Unmarshal(respBody, response); err != nil { 110 return nil, err 111 } 112 113 return response, nil 114 } else { 115 return nil, wxpay_utility.NewApiException( 116 httpResponse.StatusCode, 117 httpResponse.Header, 118 respBody, 119 ) 120 } 121} ``` -------------------------------- ### GET /v3/smartguide/guides Source: https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter3_4_7.shtml 查询已注册的服务人员信息。支持根据门店ID查询列表,或根据特定标识(工号、手机号、企业微信员工ID)查询单个服务人员。 ```APIDOC ## GET /v3/smartguide/guides ### Description 查询已注册的服务人员信息。支持根据门店ID查询列表,或根据特定标识(工号、手机号、企业微信员工ID)查询单个服务人员。 ### Method GET ### Endpoint /v3/smartguide/guides ### Parameters #### Header Parameters - **Authorization** (string) - Required - 签名认证信息 - **Accept** (string) - Required - 设置为 application/json - **Wechatpay-Serial** (string) - Required - 微信支付公钥ID或平台证书序列号 #### Query Parameters - **store_id** (integer) - Required - 门店在微信支付商户平台的唯一标识 - **userid** (string) - Optional - 企业微信的员工ID - **mobile** (string) - Optional - 服务人员手机号码(需加密) - **work_id** (string) - Optional - 服务人员工号 - **limit** (integer) - Optional - 最大资源条数,不大于10 - **offset** (integer) - Optional - 请求资源起始位置,默认值为0 ### Request Example GET /v3/smartguide/guides?store_id=1234&userid=robert&mobile=...&work_id=robert&limit=5&offset=0 ``` -------------------------------- ### Go Coupon Stock Creation Example Source: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/open/pay/chapter5_1_4.shtml Demonstrates initializing merchant configuration and creating a coupon stock request using the wxpay_utility library. ```go package main import ( "bytes" "demo/wxpay_utility" // 引用微信支付工具库,参考 https://pay.weixin.qq.com/doc/v3/partner/4015119446 "encoding/json" "fmt" "net/http" "net/url" ) func main() { // TODO: 请准备商户开发必要参数,参考:https://pay.weixin.qq.com/doc/v3/partner/4013080340 config, err := wxpay_utility.CreateMchConfig( "19xxxxxxxx", // 商户号,是由微信支付系统生成并分配给每个商户的唯一标识符,商户号获取方式参考 https://pay.weixin.qq.com/doc/v3/partner/4013080340 "1DDE55AD98Exxxxxxxxxx", // 商户API证书序列号,如何获取请参考 https://pay.weixin.qq.com/doc/v3/partner/4013058924 "/path/to/apiclient_key.pem", // 商户API证书私钥文件路径,本地文件路径 "PUB_KEY_ID_xxxxxxxxxxxxx", // 微信支付公钥ID,如何获取请参考 https://pay.weixin.qq.com/doc/v3/partner/4013038589 "/path/to/wxp_pub.pem", // 微信支付公钥文件路径,本地文件路径 ) if err != nil { fmt.Println(err) return } request := &CreateCouponStockRequest{ StockName: wxpay_utility.String("微信支付代金券批次"), Comment: wxpay_utility.String("零售批次"), BelongMerchant: wxpay_utility.String("98568865"), AvailableBeginTime: wxpay_utility.String("2015-05-20T13:29:35.120+08:00"), AvailableEndTime: wxpay_utility.String("2015-05-20T13:29:35.120+08:00"), StockUseRule: &StockRule{ MaxCoupons: wxpay_utility.Int64(100), MaxAmount: wxpay_utility.Int64(5000), MaxAmountByDay: wxpay_utility.Int64(400), MaxCouponsPerUser: wxpay_utility.Int64(3), NaturalPersonLimit: wxpay_utility.Bool(false), PreventApiAbuse: wxpay_utility.Bool(false), }, PatternInfo: &PatternInfo{ Description: wxpay_utility.String("微信支付营销代金券"), MerchantLogo: wxpay_utility.String("CDN地址"), MerchantName: wxpay_utility.String("微信支付"), BackgroundColor: BACKGROUNDCOLOR_COLOR010.Ptr(), CouponImage: wxpay_utility.String("https://qpic.cn/xxx"), JumpTarget: JUMPTARGET_PAYMENT_CODE.Ptr(), MiniProgramAppid: wxpay_utility.String("wx23232232323"), MiniProgramPath: wxpay_utility.String("/path/index/index"), }, CouponUseRule: &CouponRule{ CouponAvailableTime: &FavorAvailableTime{ FixAvailableTime: &FixedAvailableTime{ AvailableWeekDay: []int64{int64(1)}, BeginTime: wxpay_utility.Int64(0), EndTime: wxpay_utility.Int64(3600), }, SecondDayAvailable: wxpay_utility.Bool(false), AvailableTimeAfterReceive: wxpay_utility.Int64(7), }, FixedNormalCoupon: &FixedValueStockMsg{ ``` -------------------------------- ### GET /v3/smartguide/guides Source: https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter3_4_7.shtml Retrieves a list of smart guides based on the provided query parameters. ```APIDOC ## GET /v3/smartguide/guides ### Description Retrieves a list of smart guides. Supports filtering by store, user, mobile, or work ID, and includes pagination parameters. ### Method GET ### Endpoint /v3/smartguide/guides ### Parameters #### Query Parameters - **store_id** (int64) - Optional - The ID of the store. - **userid** (string) - Optional - The user ID of the guide. - **mobile** (string) - Optional - The mobile number of the guide. - **work_id** (string) - Optional - The work ID of the guide. - **limit** (int64) - Optional - The maximum number of records to return. - **offset** (int64) - Optional - The number of records to skip. ### Response #### Success Response (200) - **data** (array) - List of guide objects - **total_count** (int64) - Total number of guides found - **limit** (int64) - Limit used in the request - **offset** (int64) - Offset used in the request ``` -------------------------------- ### Partner API v3 Prepay Request Implementation in Go Source: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/open/pay/chapter2_5_3.shtml Example demonstrating how to initialize merchant configuration and execute a prepay request using the wxpay_utility library. ```go package main import ( "bytes" "demo/wxpay_utility" // 引用微信支付工具库,参考 https://pay.weixin.qq.com/doc/v3/partner/4015119446 "encoding/json" "fmt" "net/http" "net/url" "time" ) func main() { // TODO: 请准备商户开发必要参数,参考:https://pay.weixin.qq.com/doc/v3/partner/4013080340 config, err := wxpay_utility.CreateMchConfig( "19xxxxxxxx", // 商户号,是由微信支付系统生成并分配给每个商户的唯一标识符,商户号获取方式参考 https://pay.weixin.qq.com/doc/v3/partner/4013080340 "1DDE55AD98Exxxxxxxxxx", // 商户API证书序列号,如何获取请参考 https://pay.weixin.qq.com/doc/v3/partner/4013058924 "/path/to/apiclient_key.pem", // 商户API证书私钥文件路径,本地文件路径 "PUB_KEY_ID_xxxxxxxxxxxxx", // 微信支付公钥ID,如何获取请参考 https://pay.weixin.qq.com/doc/v3/partner/4013038589 "/path/to/wxp_pub.pem", // 微信支付公钥文件路径,本地文件路径 ) if err != nil { fmt.Println(err) return } request := &PartnerApiv3CommonPrepayRequest{ SpAppid: wxpay_utility.String("wx8888888888888888"), SpMchid: wxpay_utility.String("1230000109"), SubAppid: wxpay_utility.String("wxd678efh567hg6999"), SubMchid: wxpay_utility.String("1900000109"), Description: wxpay_utility.String("Image形象店-深圳腾大-QQ公仔"), OutTradeNo: wxpay_utility.String("1217752501201407033233368018"), TimeExpire: wxpay_utility.Time(time.Now()), Attach: wxpay_utility.String("自定义数据说明"), NotifyUrl: wxpay_utility.String(" https://www.weixin.qq.com/wxpay/pay.php"), GoodsTag: wxpay_utility.String("WXG"), SettleInfo: &PartnerSettleInfo{ ProfitSharing: wxpay_utility.Bool(true), }, SupportFapiao: wxpay_utility.Bool(false), Amount: &CommonAmountInfo{ Total: wxpay_utility.Int64(100), Currency: wxpay_utility.String("CNY"), }, Detail: &CouponInfo{ CostPrice: wxpay_utility.Int64(608800), InvoiceId: wxpay_utility.String("微信123"), GoodsDetail: []GoodsDetail{ GoodsDetail{ MerchantGoodsId: wxpay_utility.String("1246464644"), WechatpayGoodsId: wxpay_utility.String("1001"), GoodsName: wxpay_utility.String("iPhoneX 256G"), Quantity: wxpay_utility.Int64(1), UnitPrice: wxpay_utility.Int64(528800), }, }, }, SceneInfo: &CommonSceneInfo{ PayerClientIp: wxpay_utility.String("14.23.150.211"), DeviceId: wxpay_utility.String("013467007045764"), StoreInfo: &StoreInfo{ Id: wxpay_utility.String("0001"), Name: wxpay_utility.String("腾讯大厦分店"), AreaCode: wxpay_utility.String("440305"), Address: wxpay_utility.String("广东省深圳市南山区科技中一道10000号"), }, }, } response, err := PartnerAppPrepay(config, request) if err != nil { fmt.Printf("请求失败: %+v\n", err) // TODO: 请求失败,根据状态码执行不同的处理 return } // TODO: 请求成功,继续业务逻辑 ``` -------------------------------- ### ListGuides Request Execution Source: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/open/pay/chapter3_4_7.shtml Example of configuring the request parameters and invoking the ListGuides function. ```go 29 Mobile: wxpay_utility.String("str2WoWy8uUiWM7xahvNv0lV3C+nn3t4QlKNnyr+iwlk2FoMcn/lxrR6YdKKFI6NFJkC5oyvzNwc1MDzIgjLR0W6bJKiwWeOV3Fp0x+VIoRDONal1Mgb6VTYg7lvACEqdwmVkvbt4/oEWaWP62njMGGe0fMiBSAvao3LrcsOwDvN3E9kiaw5XQZMP/rUdWTFfy5THuohcQobGMrxclHKAnwAHU8CWfkziW5crUc3Z83uMVcFQu38y9EcWR12FJ3jip5nyVKiqCF4iDSN+JRXjWsWlqTZ0Y8Q+piBCS5ACusK6nz7mKQeypi9fKjAggRfvNFPf/bNxPvork4mMVgZkA=="), 30 WorkId: wxpay_utility.String("robert"), 31 Limit: wxpay_utility.Int64(5), 32 Offset: wxpay_utility.Int64(0), 33 } 34 35 response, err := ListGuides(config, request) 36 if err != nil { 37 fmt.Printf("请求失败: %+v\n", err) 38 // TODO: 请求失败,根据状态码执行不同的处理 39 return 40 } 41 42 // TODO: 请求成功,继续业务逻辑 43 fmt.Printf("请求成功: %+v\n", response) 44} ``` -------------------------------- ### List Guides Source: https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter3_4_7.shtml Retrieves a list of guides based on provided filter criteria. ```APIDOC ## GET /v3/merchant/guides ### Description Retrieves a list of guides associated with the merchant, supporting filtering by store ID, user ID, mobile number, or work ID. ### Method GET ### Endpoint /v3/merchant/guides ### Parameters #### Query Parameters - **store_id** (Long) - Optional - The ID of the store. - **userid** (String) - Optional - The user ID of the guide. - **mobile** (String) - Optional - The mobile number of the guide (encrypted). - **work_id** (String) - Optional - The work ID of the guide. - **limit** (Long) - Optional - The maximum number of records to return. - **offset** (Long) - Optional - The number of records to skip. ### Response #### Success Response (200) - **data** (List) - List of guide objects. - **total_count** (Long) - Total number of guides found. - **limit** (Long) - Limit used in the request. - **offset** (Long) - Offset used in the request. #### Response Example { "data": [ { "guide_id": "string", "store_id": 1234, "name": "string", "mobile": "string", "userid": "string", "work_id": "string" } ], "total_count": 1, "limit": 10, "offset": 0 } ``` -------------------------------- ### JSAPI Prepay Request Implementation in Go Source: https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_4.shtml This example demonstrates how to configure the merchant environment and execute a JSAPI prepay request. It requires the wxpay_utility library for signing and request handling. ```go package main import ( "bytes" "demo/wxpay_utility" // 引用微信支付工具库,参考 https://pay.weixin.qq.com/doc/v3/merchant/4015119334 "encoding/json" "fmt" "net/http" "net/url" "time" ) func main() { // TODO: 请准备商户开发必要参数,参考:https://pay.weixin.qq.com/doc/v3/merchant/4013070756 config, err := wxpay_utility.CreateMchConfig( "19xxxxxxxx", // 商户号,是由微信支付系统生成并分配给每个商户的唯一标识符,商户号获取方式参考 https://pay.weixin.qq.com/doc/v3/merchant/4013070756 "1DDE55AD98Exxxxxxxxxx", // 商户API证书序列号,如何获取请参考 https://pay.weixin.qq.com/doc/v3/merchant/4013053053 "/path/to/apiclient_key.pem", // 商户API证书私钥文件路径,本地文件路径 "PUB_KEY_ID_xxxxxxxxxxxxx", // 微信支付公钥ID,如何获取请参考 https://pay.weixin.qq.com/doc/v3/merchant/4013038816 "/path/to/wxp_pub.pem", // 微信支付公钥文件路径,本地文件路径 ) if err != nil { fmt.Println(err) return } request := &DirectApiv3JsapiPrepayRequest{ Appid: wxpay_utility.String("wxd678efh567hg6787"), Mchid: wxpay_utility.String("1230000109"), Description: wxpay_utility.String("Image形象店-深圳腾大-QQ公仔"), OutTradeNo: wxpay_utility.String("1217752501201407033233368018"), TimeExpire: wxpay_utility.Time(time.Now()), Attach: wxpay_utility.String("自定义数据说明"), NotifyUrl: wxpay_utility.String(" https://www.weixin.qq.com/wxpay/pay.php"), GoodsTag: wxpay_utility.String("WXG"), SupportFapiao: wxpay_utility.Bool(false), Amount: &CommonAmountInfo{ Total: wxpay_utility.Int64(100), Currency: wxpay_utility.String("CNY"), }, Payer: &JsapiReqPayerInfo{ Openid: wxpay_utility.String("oUpF8uMuAJO_M2pxb1Q9zNjWeS6o"), }, Detail: &CouponInfo{ CostPrice: wxpay_utility.Int64(608800), InvoiceId: wxpay_utility.String("微信123"), GoodsDetail: []GoodsDetail{GoodsDetail{ MerchantGoodsId: wxpay_utility.String("1246464644"), WechatpayGoodsId: wxpay_utility.String("1001"), GoodsName: wxpay_utility.String("iPhoneX 256G"), Quantity: wxpay_utility.Int64(1), UnitPrice: wxpay_utility.Int64(528800), }}, }, SceneInfo: &CommonSceneInfo{ PayerClientIp: wxpay_utility.String("14.23.150.211"), DeviceId: wxpay_utility.String("013467007045764"), StoreInfo: &StoreInfo{ Id: wxpay_utility.String("0001"), Name: wxpay_utility.String("腾讯大厦分店"), AreaCode: wxpay_utility.String("440305"), Address: wxpay_utility.String("广东省深圳市南山区科技中一道10000号"), }, }, SettleInfo: &SettleInfo{ ProfitSharing: wxpay_utility.Bool(false), }, } response, err := JsapiPrepay(config, request) if err != nil { fmt.Printf("请求失败: %+v\n", err) // TODO: 请求失败,根据状态码执行不同的处理 return } // TODO: 请求成功,继续业务逻辑 fmt.Printf("请求成功: %+v\n", response) } func JsapiPrepay(config *wxpay_utility.MchConfig, request *DirectApiv3JsapiPrepayRequest) (response *DirectApiv3JsapiPrepayResponse, err error) { const ( host = "https://api.mch.weixin.qq.com" method = "POST" path = "/v3/pay/transactions/jsapi" ) reqUrl, err := url.Parse(fmt.Sprintf("%s%s", host, path)) if err != nil { return nil, err } reqBody, err := json.Marshal(request) if err != nil { return nil, err } httpRequest, err := http.NewRequest(method, reqUrl.String(), bytes.NewReader(reqBody)) if err != nil { return nil, err } httpRequest.Header.Set("Accept", "application/json") httpRequest.Header.Set("Wechatpay-Serial", config.WechatPayPublicKeyId()) httpRequest.Header.Set("Content-Type", "application/json") authorization, err := wxpay_utility.BuildAuthorization(config.MchId(), config.CertificateSerialNo(), config.PrivateKey(), method, reqUrl.RequestURI(), reqBody) if err != nil { return nil, err } httpRequest.Header.Set("Authorization", authorization) client := &http.Client{} httpResponse, err := client.Do(httpRequest) if err != nil { return nil, err } respBody, err := wxpay_utility.ExtractResponseBody(httpResponse) if err != nil { return nil, err } if httpResponse.StatusCode >= 200 && httpResponse.StatusCode < 300 { // 2XX 成功,验证应答签名 err = wxpay_utility.ValidateResponse( ``` -------------------------------- ### Batch Operation Response Example Source: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/open/pay/chapter5_2_4.shtml Example of a successful 200 OK response containing the stock ID and creation timestamp. ```json { "stock_id" : "98065001", "create_time" : "2015-05-20T13:29:35+08:00" } ``` -------------------------------- ### Create Full Send Activity in Go Source: https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter5_7_4.shtml This example demonstrates how to initialize the merchant configuration and send a request to create a full send activity. It requires the wxpay_utility library for signing and configuration management. ```go package main import ( "bytes" "demo/wxpay_utility" // 引用微信支付工具库,参考 https://pay.weixin.qq.com/doc/v3/merchant/4015119334 "encoding/json" "fmt" "net/http" "net/url" ) func main() { // TODO: 请准备商户开发必要参数,参考:https://pay.weixin.qq.com/doc/v3/merchant/4013070756 config, err := wxpay_utility.CreateMchConfig( "19xxxxxxxx", // 商户号,是由微信支付系统生成并分配给每个商户的唯一标识符,商户号获取方式参考 https://pay.weixin.qq.com/doc/v3/merchant/4013070756 "1DDE55AD98Exxxxxxxxxx", // 商户API证书序列号,如何获取请参考 https://pay.weixin.qq.com/doc/v3/merchant/4013053053 "/path/to/apiclient_key.pem", // 商户API证书私钥文件路径,本地文件路径 "PUB_KEY_ID_xxxxxxxxxxxxx", // 微信支付公钥ID,如何获取请参考 https://pay.weixin.qq.com/doc/v3/merchant/4013038816 "/path/to/wxp_pub.pem", // 微信支付公钥文件路径,本地文件路径 ) if err != nil { fmt.Println(err) return } request := &CreateFullSendActRequest{ ActivityBaseInfo: &ActBaseInfo{ ActivityName: wxpay_utility.String("良品铺子回馈活动"), ActivitySecondTitle: wxpay_utility.String("海飞丝的券"), MerchantLogoUrl: wxpay_utility.String("https://tool.oschina.net/regex.jpg"), BackgroundColor: wxpay_utility.String("Color010"), BeginTime: wxpay_utility.String("2015-05-20T13:29:35.120+08:00"), EndTime: wxpay_utility.String("2015-05-20T13:29:35.120+08:00"), AvailablePeriods: &AvailablePeriod{ AvailableTime: []AvailableTime{AvailableTime{ BeginTime: wxpay_utility.String("2015-05-20T00:00:00.000+08:00"), EndTime: wxpay_utility.String("2015-05-20T23:59:59.000+08:00"), }}, AvailableDayTime: []AvailableDayTime{AvailableDayTime{ BeginDayTime: wxpay_utility.String("110000"), EndDayTime: wxpay_utility.String("135959"), }}, }, OutRequestNo: wxpay_utility.String("100002322019090134234sfdf"), DeliveryPurpose: DELIVERYPURPOSECATEGORY_OFF_LINE_PAY.Ptr(), MiniProgramsAppid: wxpay_utility.String("wx23232232323"), MiniProgramsPath: wxpay_utility.String("/path/index/index"), }, AwardSendRule: &FullSendRule{ TransactionAmountMinimum: wxpay_utility.Int64(100), SendContent: SENDCONTENTCATEGORY_SINGLE_COUPON.Ptr(), AwardType: AWARDTYPE_BUSIFAVOR.Ptr(), AwardList: []AwardBaseInfo{AwardBaseInfo{ StockId: wxpay_utility.String("98065001"), OriginalImageUrl: wxpay_utility.String("https://tool.oschina.net/regex.jpg"), ThumbnailUrl: wxpay_utility.String("https://tool.oschina.net/regex.jpg"), }}, MerchantOption: SENDMERCHANTOPTION_IN_SEVICE_COUPON_MERCHANT.Ptr(), MerchantIdList: []string{"10000022"}, }, AdvancedSetting: &ActAdvancedSetting{ DeliveryUserCategory: DELIVERYUSERCATEGORY_DELIVERY_ALL_PERSON.Ptr(), MerchantMemberAppid: wxpay_utility.String("34567890"), PaymentMode: &PaymentMode{ PaymentSceneList: []PaymentScene{PAYMENTSCENE_APP_SCENE}, }, PaymentMethodInformation: &PaymentMethodInfo{ PaymentMethod: PAYMENTMETHODCATEGORY_CFT.Ptr(), BankAbbreviation: wxpay_utility.String("AHRCUB_CREDIT"), }, GoodsTags: []string{"xxx"}, }, } response, err := CreateFullSendAct(config, request) if err != nil { fmt.Printf("请求失败: %+v\n", err) // TODO: 请求失败,根据状态码执行不同的处理 return } // TODO: 请求成功,继续业务逻辑 fmt.Printf("请求成功: %+v\n", response) } func CreateFullSendAct(config *wxpay_utility.MchConfig, request *CreateFullSendActRequest) (response *CreateFullSendActResponse, err error) { const ( host = "https://api.mch.weixin.qq.com" method = "POST" path = "/v3/marketing/paygiftactivity/unique-threshold-activity" ) reqUrl, err := url.Parse(fmt.Sprintf("%s%s", host, path)) if err != nil { return nil, err } reqBody, err := json.Marshal(request) if err != nil { return nil, err } httpRequest, err := http.NewRequest(method, reqUrl.String(), bytes.NewReader(reqBody)) if err != nil { return nil, err } httpRequest.Header.Set("Accept", "application/json") httpRequest.Header.Set("Wechatpay-Serial", config.WechatPayPublicKeyId()) httpRequest.Header.Set("Content-Type", "application/json") ``` -------------------------------- ### Successful API Response Example Source: https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter5_7_4.shtml Example of a successful 200 OK response containing activity ID and creation timestamp. ```json { "activity_id" : "10028001", "create_time" : "2015-05-20T13:29:35.120+08:00" } ``` -------------------------------- ### Go Merchant Configuration Initialization Source: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/open/pay/chapter7_1_4.shtml Example of initializing merchant configuration using the wxpay_utility library. ```go package main import ( "bytes" "demo/wxpay_utility" // 引用微信支付工具库,参考 https://pay.weixin.qq.com/doc/v3/partner/4015119446 "encoding/json" "fmt" "net/http" "net/url" ) func main() { // TODO: 请准备商户开发必要参数,参考:https://pay.weixin.qq.com/doc/v3/partner/4013080340 config, err := wxpay_utility.CreateMchConfig( "19xxxxxxxx", // 商户号,是由微信支付系统生成并分配给每个商户的唯一标识符,商户号获取方式参考 https://pay.weixin.qq.com/doc/v3/partner/4013080340 "1DDE55AD98Exxxxxxxxxx", // 商户API证书序列号,如何获取请参考 https://pay.weixin.qq.com/doc/v3/partner/4013058924 "/path/to/apiclient_key.pem", // 商户API证书私钥文件路径,本地文件路径 "PUB_KEY_ID_xxxxxxxxxxxxx", // 微信支付公钥ID,如何获取请参考 https://pay.weixin.qq.com/doc/v3/partner/4013038589 "/path/to/wxp_pub.pem", // 微信支付公钥文件路径,本地文件路径 ) if err != nil { fmt.Println(err) return } request := &SubmitReq{ BusinessCode: wxpay_utility.String("1900013511_10000"), ContactInfo: &ContactInfo{ ContactType: IDHOLDERTYPE_LEGAL.Ptr(), ``` -------------------------------- ### H5 Payment Response Example Source: https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_6_3.shtml Example of a successful response containing the h5_url used to initiate the WeChat Pay checkout page. ```json { "h5_url" : "https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx2016121516420242444321ca0631331346&package=1405458241" } ```