파이선에서 다른 가상환경을 이용하는 스크립트를 실행하기

  • 종종 다른 의존성 라이브러리를 사용하는 파이선 코드를 또 다른 파이선 코드 내부에서 실행해야 하는 경우가 있습니다.
  • 다음과 같은 상황을 가정해 봅시다.
    • a.py라는 파이선 프로그램은 conda activate a_config로 가상환경을 지정하고 실행했습니다.
    • 이때 conda activate b_config로 가상환경을 지정하고 실행해야 하는 b.py를, a.py 내부에서 실행시키고 싶습니다.
    • 어떻게 해야 할까요? 아래 코드를 참고하시면 됩니다.
  • 먼저 b.py를 실행시키는 쉘스크립트 b.sh를 만듭니다.
  • 경로는 사용하시는 값으로 지정하셔야 합니다! b.sh는 b.py가 있는 경로에 만들겠습니다.
#!/bin/bash
PATH=$PATH:${conda가 설치된 경로}/anaconda3/envs/b_config/bin
cd ${b.py가 존재하는 경로}
python b.py
  • 그리고 나서 a.py에서 아래처럼 b.sh를 실행해 주세요.
import subprocess

try:
    b_path = "b.py가 있는 경로"
    conda_path = "b_config가 설치된 경로"
    python_version = "b_config가 사용하는 파이선 버전 ex:python3.10"
    os.chdir(b_path)
    new_env = {
        "PATH": b_path,
        "PYTHONPATH": "%s/lib/%s/site-packages" % (conda_path python_version),
    }
    subprocess.run(["b.sh", 필요한 인자값들...], env=new_env)    
except Exception as e:
    print(e)
  • 인자값들이 필요하면 쉼표로 구분하면서 이어 넣으면 됩니다.

NodeJS 서버에서 애플 인앱결제 유효성 검증을 하는 방법

  • 지난 시간에 구글 안드로이드 인앱결제 유효성 검증을 알아봤습니다.
  • 오늘은 애플 아이폰용 앱에서 인앱결제를 했을 경우에, 결제정보의 유효성 검증을 알아보겠습니다.
  • 2024년 5월 현재, 지금 소개하는 방법은 사용가능한 것입니다.
  • 사전에 처리해야 하는 과정은 생략할게요, 그 부분은 다른데서 검색하셔도 됩니다.
  • 저는 iap 패키지를 이용했습니다.
const iap = require('iap')

const platform = 'apple';
const payment = {
    receipt: "애플로부터 받은 pay receipt",
    productId: "애플에 등록해둔 상품ID",
    packageName: '앱 패키지 네임',
    excludeOldTransactions: true,
};
try {
    const resp = await new Promise((resolve, reject) => {
        iap.verifyPayment(platform, payment, (err, response) => {
            if (err) {
                reject(err)
            }
            resolve(response)
        })
    })
    if (resp.transactionId === "애플에서 보내온 결제ID") {
        return true
    }
} catch (e) {
    console.error(e)
}
  • secret을 넣으라고 되어 있는 글들이 있던데요, 제가 확인한 바로는 오히려 에러가 납니다.
  • iap 패키지의 함수가 async/await을 지원하지 않아서 직접 구현했습니다.

NodeJS 서버에서 안드로이드 인앱결제 유효성 검증을 하는 방법

  • 구글 안드로이드용 앱에서 인앱결제를 했을 경우에, 결제정보가 리턴되는데요.
  • 리턴된 값이 제대로된 값인지 혹시 위조된 것은 아닌지 검증할 필요가 있습니다.
  • 제가 여기저기 검색을 해본 결과, 안되는 내용을 올려놓은 포스팅들이 있더군요.
  • 2024년 4월 현재, 지금 소개하는 방법은 사용가능한 것입니다.
  • 사전에 처리해야 하는 과정은 생략할게요, 그 부분은 다른데서 검색하셔도 됩니다.
  • 서비스계정 만들고, 플레이스토어에서 계정 연동 시키는 등의 과정은 같아요.
const {google} = require('googleapis')
const path = require('path')

// 서비스 계정 만들면서 다운로드 받은 json 파일이 필요합니다
const realPath = path.join(__dirname, '../XXXXXXX.json')
const auth = new google.auth.JWT(
    "서비스계정 이메일 주소",
    null,
    require(realPath).private_key,
    // 아래 scopes 꼭 지정해야 하구요
    ['https://www.googleapis.com/auth/androidpublisher'],
    null
)

google.options({auth: auth})

const iap = google.androidpublisher('v3')
const packageName = "앱의 패키지 네임이 들어갑니다"
try {
    const resp = await iap.purchases.products.get({
        packageName: packageName,
        productId: "플레이스토어에서 등록한 상품ID",
        token: "검증하고자 하는 결제 정보의 purchaseToken 값",
    })
    if (resp.data.orderId === "결제ID") {
        // 올바른 결제 정보
    }
} catch (e) {
    console.error(e)
}