package wechatpayopen import ( "context" "fmt" "go.dtapp.net/gorandom" "time" ) // GetJsApi 入参 type GetJsApi struct { Package string `json:"package"` } // GetJsApiResult 返回参数 type GetJsApiResult struct { AppId string `json:"app_id"` // 应用ID TimeStamp string `json:"time_stamp"` // 时间戳 NonceStr string `json:"nonce_str"` // 随机字符串 Package string `json:"package"` // 订单详情扩展字符串 SignType string `json:"sign_type"` // 签名方式 PaySign string `json:"pay_sign"` // 签名 } // GetJsApi JSAPI调起支付API https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_4.shtml func (c *Client) GetJsApi(ctx context.Context, param GetJsApi) (result GetJsApiResult, err error) { // sign params timeStamp := time.Now().Unix() nonce := gorandom.Alphanumeric(32) result.AppId = c.GetSubAppid() result.TimeStamp = fmt.Sprintf("%v", timeStamp) // 时间戳 result.NonceStr = nonce // 随机字符串 result.Package = param.Package // 订单详情扩展字符串 // 签名 message := fmt.Sprintf("%s\n%s\n%s\n%s\n", c.GetSubAppid(), fmt.Sprintf("%v", timeStamp), nonce, param.Package) signBytes, err := c.signPKCS1v15(message, []byte(c.GetMchSslKey())) if err != nil { return result, err } sign := c.base64EncodeStr(signBytes) result.PaySign = sign // 签名 result.SignType = "RSA" // 签名方式 return result, nil }