WeChat Pay는 매우 일반적인 온라인 결제 방법이므로 많은 웹사이트/애플리케이션에서 이 기능을 통합해야 합니다. 이 글에서는 Golang을 사용하여 WeChat 결제 기능을 구현하는 방법을 소개합니다. 이 기사에서는 Gin 프레임워크를 사용하여 간단한 웹 애플리케이션을 구축하고 go-wechat WeChat SDK를 사용하여 WeChat 결제를 신속하게 구현해 보겠습니다.
이 튜토리얼에서는 간단한 전자상거래 웹사이트를 구축해 보겠습니다. 웹사이트는 다음 기능을 구현해야 합니다.
시작하기 전에 다음 요구 사항이 있는지 확인하세요.
appid
, mch_id
, 키
및 기타 매개변수. appid
、mch_id
、key
等参数。在继续之前,请从 go-wechat 的 Github 存储库中安装微信 SDK。
go get github.com/silenceper/wechat/v2
从微信支付账户中获得以下参数并将其添加到系统环境变量中:
APP_ID
: 微信 APP_IDMCH_ID
: 商户号API_KEY
: 商户 API 密钥export APP_ID=your_appid export MCH_ID=your_mchid export API_KEY=your_api_key
在文件 main.go
中,我们将使用 gin 包来初始化应用程序。
package main import ( "net/http" "github.com/gin-gonic/gin" ) func main() { router := gin.Default() router.GET("/", func(c *gin.Context) { c.String(http.StatusOK, "Hello World!") }) router.Run(":8080") }
在上一页中,我们设置了基本的 Gin 应用程序。我们现在将添加微信登录功能。
您可以选择通过 JSON 、YAML 或 TOML 格式定义配置。这里,我们将 创建一个 config.json
文件来定义配置。
{ "wechat": { "appid": "your_appid", "secret": "your_app_secret" } }
下一步是初始化 WeChatClient
并使用 oauth2
请求代码来获取访问令牌。
import ( "encoding/json" "io/ioutil" "net/http" "os" "github.com/silenceper/wechat/v2" ) func loadConfig() map[string]string { file, err := os.Open("config.json") if err != nil { panic("Failed to load config file.") } defer file.Close() data, err := ioutil.ReadAll(file) if err != nil { panic("Failed to read config file.") } var config map[string]map[string]string err = json.Unmarshal(data, &config) if err != nil { panic("Failed to parse config file.") } return config["wechat"] } func initializeWeChat() *wechat.WeChat { config := loadConfig() client := wechat.NewWechat(&wechat.Config{ AppID: config["appid"], AppSecret: config["secret"], Token: "", EncodingAESKey: "", }) return client } func weChatLoginHandler(c *gin.Context) { client := initializeWeChat() redirectURL := "<YOUR_REDIRECT_URL>" url := client.Oauth2.GetRedirectURL(redirectURL, "snsapi_userinfo", "") c.Redirect(http.StatusTemporaryRedirect, url) }
从本质上讲,我们定义了一个包含应用程序的身份验证的 WeChatClient。我们还定义了一个 Gin 处理程序,该处理程序设置了重定向 URL 并使用 WeChatClient
中的 oauth2
请求获取访问令牌。
在重定向 URL 中,用户授权我们的应用程序在其账户下运行时,将调用 /wechat/callback
处理程序。该处理程序将用户的微信 ID、昵称和其他公开数据存储在用户会话中。
func callbackHandler(c *gin.Context) { code := c.Request.URL.Query().Get("code") client := initializeWeChat() accessToken, err := client.Oauth2.GetUserAccessToken(code) if err != nil { panic("Failed to get access token from WeChat.") } userInfo, err := client.Oauth2.GetUserInfo(accessToken.AccessToken, accessToken.Openid) if err != nil { panic("Failed to get user info from WeChat.") } session := sessions.Default(c) session.Set("wechat_openid", userInfo.Openid) session.Set("wechat_nickname", userInfo.Nickname) session.Save() c.Redirect(http.StatusTemporaryRedirect, "/") }
我们应该将微信登录集成到我们的应用程序中。这个过程相对简单。仅需将处理程序添加到 Gin 路由器即可。
func main() { ... router.GET("/wechat/login", weChatLoginHandler) router.GET("/wechat/callback", callbackHandler) ... }
我们将为应用程序添加 basic 的购物车状态。只需在用户会话中添加购物车信息即可。
type CartItem struct { ProductID int Quantity int } func (c *CartItem) Subtotal() float64 { // TODO: Implement. } type Cart struct { Contents []*CartItem } func (c *Cart) Add(productID, quantity int) { item := &CartItem{ ProductID: productID, Quantity: quantity, } found := false for _, existingItem := range c.Contents { if existingItem.ProductID == productID { existingItem.Quantity += quantity found = true break } } if !found { c.Contents = append(c.Contents, item) } } func (c *Cart) Remove(productID int) { for i, item := range c.Contents { if item.ProductID == productID { c.Contents = append(c.Contents[:i], c.Contents[i+1:]...) break } } } func (c *Cart) Total() float64 { total := 0.0 for _, item := range c.Contents { total += item.Subtotal() } return total } func cartFromSession(session sessions.Session) *Cart { value := session.Get("cart") if value == nil { return &Cart{} } cartBytes := []byte(value.(string)) var cart Cart json.Unmarshal(cartBytes, &cart) return &cart } func syncCartToSession(session sessions.Session, cart *Cart) { cartBytes, err := json.Marshal(cart) if err != nil { panic("Failed to sync cart with session data store.") } session.Set("cart", string(cartBytes)) session.Save() }
如上所示,我们实现了一个包含 Add(productID, quantity int)
,Remove(productID int)
, Total() float64
几个方法的 cart struct。我们从会话中存储和加载 cart 数据 (cartFromSession()
和 syncCartToSession()
),并通过 CartItem.Subtotal()
<footer> <div class="container"> <div class="row"> <div class="col-sm-4"> <a href="/">Back to home</a> </div> <div class="col-sm-4"> <p id="cart-count"></p> </div> <div class="col-sm-4"> <p id="cart-total"></p> </div> </div> </div> </footer> <script> document.getElementById("cart-count").innerText = "{{.CartItemCount}} items in cart"; document.getElementById("cart-total").innerText = "Total: ${{.CartTotal}}"; </script>
WeChat 결제 계정에서 다음 매개변수를 가져와 시스템 환경 변수에 추가합니다.
APP_ID
: WeChat APP_ID MCH_ID
: 판매자 번호API_KEY
: 판매자 API 키type Order struct { OrderNumber string Amount float64 }
애플리케이션 빌드
main.go< /code>, gin 패키지를 사용하여 애플리케이션을 초기화합니다. <li><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:go;toolbar:false;'>func generateOutTradeNo() string {
// TODO: Implement.
}
func createOrder(cart *Cart) *Order {
order := &Order{
OrderNumber: generateOutTradeNo(),
Amount: cart.Total(),
}
client := initializeWeChat()
payment := &wechat.Payment{
AppID: APP_ID,
MchID: MCH_ID,
NotifyURL: "<YOUR_NOTIFY_URL>",
TradeType: "JSAPI",
Body: "购物车结算",
OutTradeNo: order.OrderNumber,
TotalFee: int(order.Amount * 100),
SpbillCreateIP: "127.0.0.1",
OpenID: "<USER_WECHAT_OPENID>",
Key: API_KEY,
}
result, err := client.Pay.SubmitPayment(payment)
if err != nil {
panic("Failed to submit payment.")
}
// Save order state and return it.
return order
}</pre><div class="contentsignin">로그인 후 복사</div></div><h3>앱에 WeChat 로그인 추가</h3></li>이전 페이지에서는 기본 Gin 앱을 설정했습니다. 이제 WeChat 로그인 기능을 추가하겠습니다. </ol><p></p>구성 파일 추가<p></p><ul>JSON, YAML 또는 TOML 형식을 통해 구성을 정의하도록 선택할 수 있습니다. 여기서는 구성을 정의하기 위해 <code>config.json
파일을 생성합니다. func setupCheckOrderStatus() { go func() { for { // Wait 10 seconds before checking (or less if you want to check more frequently). time.Sleep(10 * time.Second) client := initializeWeChat() // TODO: Retrieve orders that need to be checked. for _, order := range ordersToCheck { queryOrderResult, err := client.Pay.QueryOrder(&wechat.QueryOrderParams{ OutTradeNo: order.OrderNumber, }) if err != nil { panic("Failed to query order.") } switch queryOrderResult.TradeState { case wechat.TradeStateSuccess: // Handle order payment in your app. order.Paid = true // TODO: Update order state in database. case wechat.TradeStateClosed: // Handle order payment in your app. order.Paid = false // TODO: Update order state in database. case wechat.TradeStateRefund: // Handle order payment in your app. order.Paid = false // TODO: Update order state in database. default: break } // TODO: Remove checked order from cache. } } }() }
WeChatClient
를 초기화하고 oauth2
요청 코드를 사용하여 액세스 토큰을 얻는 것입니다. rrreeeWeChatClient
의 oauth2
요청을 사용하여 액세스 토큰을 얻는 Gin 핸들러를 정의합니다. /wechat/callback
핸들러는 사용자가 자신의 계정에서 앱을 실행하도록 인증할 때 호출됩니다. 이 핸들러는 사용자의 WeChat ID, 닉네임 및 기타 공개 데이터를 사용자 세션에 저장합니다. 🎜rrreeeAdd(productID, amount int)
, Remove(productID int)
, Total() float64
를 포함하는 함수를 구현했습니다. > 여러 메소드가 있는 카트 구조체. 세션(cartFromSession()
및 syncCartToSession()
)에서 장바구니 데이터를 저장 및 로드하고 CartItem.Subtotal()
메서드를 통해 항목을 계산합니다. 소계의. 🎜🎜페이지 하단에 장바구니 상태 표시: 🎜rrreee🎜WeChat 결제🎜🎜WeChat 결제를 구현하려면 주문 구조를 정의하고 주문을 생성하여 WeChat 결제로 보내고 결제를 처리해야 합니다. 공고. 아래는 간단한 구현입니다. 🎜🎜🎜주문 구조 정의🎜🎜rrreee🎜🎜주문 생성 및 WeChat으로 주문 보내기🎜🎜🎜이 단계에서는 WeChat 결제를 통해 주문을 생성하고 주문 번호를 생성하겠습니다. 자세히 알아보려면 go-wechat의 결제 문서를 읽어보세요. 🎜rrreee🎜🎜WeChat 결제 알림 처리🎜🎜🎜WeChat에서 사용자의 결제가 접수되었음을 알린 후 콜백에 나중에 쿼리할 수 있도록 주문 상태를 저장합니다. 🎜rrreee🎜WeChat 강제로 주문 상태가 변경되는 거래를 확인하려면 쿼리 기능을 호출해야 합니다. WeChat SDK는 다음 상태 중 하나를 반환합니다. 🎜🎜🎜TradeStateSuccess: 사용자의 결제가 성공했습니다. 🎜🎜TradeStateClosed: 주문이 종료되었습니다. 🎜🎜TradeStateRefund: 거래가 환불되었습니다. 🎜🎜🎜요약🎜🎜 이번 글에서는 Golang과 Gin 프레임워크를 사용해 전자상거래 웹사이트를 구축하는 방법, go-wechat SDK를 사용해 위챗 로그인과 결제 기능을 빠르게 구현하는 방법을 배웠습니다. WeChatClient를 통해 사용자 인증 및 권한 부여를 처리하는 방법과 사용자 세션에 WeChat 사용자 데이터를 저장하는 방법을 배웠습니다. 또한 go-wechat SDK를 이용해 간단한 장바구니와 주문을 정의하고 위챗페이와 연동하는 방법도 배웠습니다. 🎜위 내용은 Golang을 사용하여 웹 애플리케이션용 WeChat 결제를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!