WeChat Pay는 매우 일반적인 온라인 결제 방법이므로 많은 웹사이트/애플리케이션에서 이 기능을 통합해야 합니다. 이 글에서는 Golang을 사용하여 WeChat 결제 기능을 구현하는 방법을 소개합니다. 이 기사에서는 Gin 프레임워크를 사용하여 간단한 웹 애플리케이션을 구축하고 go-wechat WeChat SDK를 사용하여 WeChat 결제를 신속하게 구현해 보겠습니다.
Requirements
이 튜토리얼에서는 간단한 전자상거래 웹사이트를 구축해 보겠습니다. 웹사이트는 다음 기능을 구현해야 합니다.
- 사용자는 WeChat을 통해 웹사이트에 로그인합니다.
- 사용자는 제품을 탐색하고 장바구니에 항목을 추가합니다.
- 사용자는 WeChat Pay를 사용하여 상품을 구매할 수 있습니다.
준비
시작하기 전에 다음 요구 사항이 있는지 확인하세요.
- WeChat 결제 계정을 등록하고
appid
,mch_id
,키
및 기타 매개변수.appid
、mch_id
、key
等参数。 - 安装了 Golang 和 Gin 框架。
安装 go-wechat SDK
在继续之前,请从 go-wechat 的 Github 存储库中安装微信 SDK。
go get github.com/silenceper/wechat/v2
配置环境变量
从微信支付账户中获得以下参数并将其添加到系统环境变量中:
-
APP_ID
: 微信 APP_ID -
MCH_ID
: 商户号 -
API_KEY
: 商户 API 密钥
export APP_ID=your_appid export MCH_ID=your_mchid export API_KEY=your_api_key
构建应用程序
初始化 Gin
在文件 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" } }
- 初始化 WeChat
下一步是初始化 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()
go-wechat SDK 설치
진행하기 전에 go-wechat Github 저장소에서 WeChat SDK를 설치하세요.
<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 }
애플리케이션 빌드
Gin 초기화
- 파일
main.go, gin 패키지를 사용하여 애플리케이션을 초기화합니다. <li><pre class='brush:php;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><h3 id="앱에-WeChat-로그인-추가">앱에 WeChat 로그인 추가</h3>
</li>이전 페이지에서는 기본 Gin 앱을 설정했습니다. 이제 WeChat 로그인 기능을 추가하겠습니다.
- JSON, YAML 또는 TOML 형식을 통해 구성을 정의하도록 선택할 수 있습니다. 여기서는 구성을 정의하기 위해
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. } } }() }
- WeChat 초기화
- 다음 단계는
WeChatClient
를 초기화하고oauth2
요청 코드를 사용하여 액세스 토큰을 얻는 것입니다.
config.json
파일을 생성합니다. 기본적으로 애플리케이션에 대한 인증이 포함된 WeChatClient를 정의합니다. 또한 리디렉션 URL을 설정하고 WeChatClient
의 oauth2
요청을 사용하여 액세스 토큰을 얻는 Gin 핸들러를 정의합니다.
WeChat 인증 처리🎜🎜🎜리디렉션 URL에서 /wechat/callback
핸들러는 사용자가 자신의 계정에서 앱을 실행하도록 인증할 때 호출됩니다. 이 핸들러는 사용자의 WeChat ID, 닉네임 및 기타 공개 데이터를 사용자 세션에 저장합니다. 🎜rrreee- 🎜WeChat 로그인 통합🎜🎜🎜WeChat 로그인을 애플리케이션에 통합해야 합니다. 과정은 비교적 간단합니다. Gin 라우터에 핸들러를 추가하기만 하면 됩니다. 🎜rrreee🎜장바구니 구현🎜🎜기본 장바구니 상태를 애플리케이션에 추가하겠습니다. 사용자 세션에 장바구니 정보를 추가하기만 하면 됩니다. 🎜rrreee🎜위와 같이
Add(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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

Golang은 실제 응용 분야에서 탁월하며 단순성, 효율성 및 동시성으로 유명합니다. 1) 동시 프로그래밍은 Goroutines 및 채널을 통해 구현됩니다. 2) Flexible Code는 인터페이스 및 다형성을 사용하여 작성됩니다. 3) NET/HTTP 패키지로 네트워크 프로그래밍 단순화, 4) 효율적인 동시 크롤러 구축, 5) 도구 및 모범 사례를 통해 디버깅 및 최적화.

GO의 핵심 기능에는 쓰레기 수집, 정적 연결 및 동시성 지원이 포함됩니다. 1. Go Language의 동시성 모델은 고루틴 및 채널을 통한 효율적인 동시 프로그래밍을 실현합니다. 2. 인터페이스 및 다형성은 인터페이스 방법을 통해 구현되므로 서로 다른 유형을 통일 된 방식으로 처리 할 수 있습니다. 3. 기본 사용법은 기능 정의 및 호출의 효율성을 보여줍니다. 4. 고급 사용에서 슬라이스는 동적 크기 조정의 강력한 기능을 제공합니다. 5. 레이스 조건과 같은 일반적인 오류는 Getest-race를 통해 감지 및 해결할 수 있습니다. 6. 성능 최적화는 sync.pool을 통해 개체를 재사용하여 쓰레기 수집 압력을 줄입니다.

Go Language는 효율적이고 확장 가능한 시스템을 구축하는 데 잘 작동합니다. 장점은 다음과 같습니다. 1. 고성능 : 기계 코드로 컴파일, 빠른 달리기 속도; 2. 동시 프로그래밍 : 고어 라틴 및 채널을 통한 멀티 태스킹 단순화; 3. 단순성 : 간결한 구문, 학습 및 유지 보수 비용 절감; 4. 크로스 플랫폼 : 크로스 플랫폼 컴파일, 쉬운 배포를 지원합니다.

SQL 쿼리 결과의 정렬에 대해 혼란스러워합니다. SQL을 학습하는 과정에서 종종 혼란스러운 문제가 발생합니다. 최근 저자는 "Mick-SQL 기본 사항"을 읽고 있습니다.

기술 스택 컨버전스와 기술 선택의 관계, 소프트웨어 개발에서 기술 스택의 선택 및 관리는 매우 중요한 문제입니다. 최근에 일부 독자들은 ...

골란 ...

GO 언어로 세 가지 구조를 비교하고 처리하는 방법. GO 프로그래밍에서는 때때로 두 구조의 차이점을 비교하고 이러한 차이점을 ...에 적용해야합니다.

GO에서 전 세계적으로 설치된 패키지를 보는 방법? Go Language로 발전하는 과정에서 Go는 종종 사용합니다 ...


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

안전한 시험 브라우저
안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.
