회사에서 결제 쪽을 리팩토링 하면서 중국 쪽 결제수단인 알리페이 결제를 했던 내용을 적어보고자 한다.
결제는 안드로이드 앱으로 주로 하게 되므로, 안드로이드팀과 얘기를 하면서 진행했다.
원래 알리페이는 연동되어 사용하고 있엇지만, 알리페이 결제 수단 갱신과
늘 그렇다싶이 기존에 하던 사람이 없으면 새롭게 하게 되는 법 ㅎㅎ..
그래서 회사에서 했던 내용을 기록차 짧게 적어본다.
개발자 문서는 아래 링크로 들어가면 된다. (중국어..)
https://opendocs.alipay.com/common/02np8r
小程序文档 - 支付宝文档中心
opendocs.alipay.com
수정전 결제 직접 결제 테스트 및 플로우
테스트가 되는지 여쭤보고 플로우를 정리했다.
플로우는 위와 같이 되고 내가 해야하는 부분은 기존 플로우에서 알리 페이 결제에 대한 부분이다.
앱 결제를 하기 위한 사전 작업
전제조건
1. 중국계좌, 중국폰
2. 알리페이 가입
3. 알리페이 결제를 위한 API 토큰 발급
1 번은 회사 및 개인 재량이기에... ,2 번은 인터넷에 퍼져있고
3번만 설명하겠다.
아래 링크로 들어가면 app용 설정을 따로 할 수 있다.
https://opendocs.alipay.com/isv/03l740?pathHash=8d712d50
小程序文档 - 支付宝文档中心
opendocs.alipay.com
참고로 한글로 번역하면 이상하니 영어로 번역해서 보는 걸 추천!
툴을 자기 OS 맡게 다운로드한다.
다운받았다면 아래와 같은 이미지의 창이 보일 거다.
저렇게 보인다면 아래와 문서대로 키를 발급받으면 된다.
https://opendocs.alipay.com/common/02khjq?pathHash=67b919d7
小程序文档 - 支付宝文档中心
opendocs.alipay.com
앱 결제 코드 작성
const fs = require('fs')
const qs = require('querystring')
const crypto = require('crypto')
const APP_ID = '12312312313123123' // 앱팀 appId
const URL = '결제 결과 받을 URL'
const PRIVATE_KEY = fs.readFileSync('alipay-private.pem', 'ascii').replace(/\\n/gm, '\\n')
getBizContentParams (options) {
return {
timeout_express: '30m',
product_code: 'QUICK_MSECURITY_PAY',
total_amount: 10000
subject: options.subject || '',
body: 'Purchase',
out_trade_no: options.order_id
}
}
createRSA2Sign (params) {
const privateKey = `-----BEGIN PRIVATE KEY-----\n${PRIVATE_KEY}-----END PRIVATE KEY-----`
const sortedParams = Object.keys(params).sort().reduce((result, key) => {
result[key] = params[key]
return result
}, {})
const query = Object.keys(sortedParams).map((key) => {
return `${key}=${params[key]}`
}).join('&')
return crypto.createSign('RSA-SHA256')
.update(query)
.sign(privateKey, 'base64')
}
getCommonParams () {
return {
app_id: APP_ID,
charset: 'utf-8',
format: 'JSON',
sign_type: 'RSA2',
method: 'alipay.trade.app.pay',
version: '1.0',
timestamp: '결제날짜',
notify_url: URL,
biz_content: JSON.stringify({ ...this._getBizContentParams(options) })
}
}
getPaymentParams (options) {
const params = this.getCommonParams(options)
const sign = this.createRSA2Sign(params)
// 앱팀에서는 서버에서 만들어준 옵션과 쿼리들로 바로 결제시를 시도함
const alipayUrlQuery = `${qs.stringify(params)}&sign=${encodeURIComponent(sign)}`
return { ...params, sign, alipayUrlQuery }
}
사실 코드는 그렇게 어렵지 않다.
위에 내용이 끝... 회사마다 조금씩 차이는 잇겠지만
결제 정보의 키값들을 가지고 sign -> 쿼리스트링 -> 앱 전달
이렇게 하면 최종적으로 앱에서는 위 내용을 가지고 결제를 alipay로 쏘고 업데이트를 시도한다.
앱 결제 결과
⭐️ 상용에서도 잘작동됨
참고 - 알리페이 웹에서의 로그인
https://authstl.alipay.com/login/index.htm
登录 - 支付宝
authstl.alipay.com
- 가입한 아이디로 로그인
로그인 후 인증
중국폰으로 인증 번호 확인
'개발노트 > 개발기록' 카테고리의 다른 글
k8s pod OOMkill 발생하는 이유 (0) | 2023.06.28 |
---|---|
데이터독 적용 및 세팅 (0) | 2023.06.05 |
Apple OAuth 탈퇴 개선 (0) | 2023.06.02 |
iOS Storekit2 사용 및 결제 개선 (0) | 2023.06.01 |
[App Push] 앱 푸시 고도화 part.3 (Pushy - CN) (0) | 2023.04.19 |