Quellcode durchsuchen

linepay final tune

conradlan vor 3 Jahren
Ursprung
Commit
0359a1ecbb

+ 2 - 0
.vscode/launch.json

@@ -15,6 +15,8 @@
                 "0.0.0.0",
                 "--port",
                 "8751",
+                "--ssl-keyfile=/home/conrad/privkey.pem",
+                "--ssl-certfile=/home/conrad/fullchain.pem",
                 "--reload"
             ],
             "jinja": true

+ 1 - 1
app/api/api_v1/api.py

@@ -8,4 +8,4 @@ api_router.include_router(users.router, prefix="/user", tags=["user"])
 api_router.include_router(nft.router, prefix="/nft", tags=["nft"])
 api_router.include_router(line.router, prefix="/line", tags=["line"])
 api_router.include_router(joyso.router, prefix="/joyso", tags=["joyso"])
-api_router.include_router(linepay.router, prefix="/linepay", tags=["linepay"])
+api_router.include_router(linepay.router, prefix="/linepay", tags=["linepay"])

+ 15 - 9
app/api/api_v1/endpoints/linepay.py

@@ -5,9 +5,8 @@ from fastapi.param_functions import Depends
 from linepay import LinePayApi
 from fastapi.templating import Jinja2Templates
 from sqlalchemy.orm.session import Session
-from app import crud, models, schemas
+from app import crud, schemas
 from app.api import deps
-from app.db import session
 
 # template
 templates = Jinja2Templates(directory="templates")
@@ -22,7 +21,7 @@ HOST_NAME = "https://api.ptt.cx:8750"
 LINE_PAY_CHANNEL_ID = LINE_PAY_CHANNEL_ID
 LINE_PAY_CHANNEL_SECRET = "37336af5452f74ee871a9fa38d81602e"
 # LINE_PAY_REQEST_BASE_URL = "https://{}".format(HOST_NAME)
-LINE_PAY_REQEST_BASE_URL = "https://api.ptt.cx:8750"
+LINE_PAY_REQEST_BASE_URL = "https://api.ptt.cx:8750/api/v1/linepay"
 line = LinePayApi(
     LINE_PAY_CHANNEL_ID, LINE_PAY_CHANNEL_SECRET, is_sandbox=True
 )
@@ -33,20 +32,21 @@ CACHE = {}
 
 # Request
 @router.post('/request')
-async def pay_request(nft_id: str, db: Session = Depends(deps.get_db)):
+async def pay_request(
+        line_id:str, nft_id: str, db: Session = Depends(deps.get_db)
+    ):
     order_id = str(uuid.uuid4())
     amount = "1"
     currency = "TWD"
     nft = crud.nft.get(db=db, id=nft_id)
 
-
     request_options = {
         "amount": amount,
         "currency": currency,
         "orderId": order_id,
         "packages": [
             {
-                "id": "NFT",
+                "id": nft.id,
                 "amount": 1,
                 "products": [
                     {
@@ -64,6 +64,7 @@ async def pay_request(nft_id: str, db: Session = Depends(deps.get_db)):
             # "cancelUrl": LINE_PAY_REQEST_BASE_URL + "/cancel/"
         }
     }
+
     response = line.request(request_options)
     transaction_id = int(response.get("info", {}).get("transactionId", 0))
     check_result = line.check_payment_status(transaction_id)
@@ -74,18 +75,23 @@ async def pay_request(nft_id: str, db: Session = Depends(deps.get_db)):
     response["paymentStatusCheckReturnMessage"] = check_result.get(
         "returnMessage", None
     )
+    payment_obj = schemas.payment.PaymentBase(
+        order_id=order_id, transaction_id=transaction_id,
+        payload=str(request_options), line_id=line_id
+    )
+    payment = crud.payment.create(db=db, obj_in=payment_obj)
     # return response
     return response
 
 
 # Confirm
-@router.get('/confirm/')
+@router.get('/confirm')
 async def pay_confirm(
     transactionId: int = "transactionId",
 ):
     CACHE["transaction_id"] = transactionId
     response = line.confirm(
-        transactionId, float(CACHE.get("amount", 0)),
+        transactionId, float(CACHE.get("amount", 1)),
         CACHE.get("currency", "TWD"))
     check_result = line.check_payment_status(transactionId)
     payment_details = line.payment_details(transaction_id=transactionId)
@@ -99,6 +105,6 @@ async def pay_confirm(
     response["payment_details"] = payment_details
     if(response["paymentStatusCheckReturnCode"] == '0123'):
         # return response
-        return "confirm.html", {"request": response}
+        return "OK"
     else:
         return "Not found"

+ 21 - 0
app/api/api_v1/endpoints/models.py

@@ -0,0 +1,21 @@
+from pydantic import BaseModel
+
+class TransactionNft(BaseModel):
+    nftid: str
+    address: str
+
+class BuyNft(BaseModel):
+    nftid: int
+    userid: str
+
+class NftDrops(BaseModel):
+    userid: str
+    email: str
+
+class callBack(BaseModel):
+    type: str
+    data: dict
+
+class JoysoMint(BaseModel):
+    toaddress: str
+    amount: int

+ 5 - 0
app/crud/__init__.py

@@ -1,5 +1,10 @@
 # from .crud_item import item
 # from .crud_user import user
+from app.models.payment import Payment
+from app.schemas.payment import PaymentCreate, PaymentUpdate
 from .crud_user import user
 from .crud_nft import nft
 # For a new basic set of CRUD operations you could just do
+from .base import CRUDBase
+
+payment = CRUDBase[Payment, PaymentCreate, PaymentUpdate](Payment)

+ 2 - 1
app/main.py

@@ -4,7 +4,8 @@ from starlette.middleware.cors import CORSMiddleware
 from app.api.api_v1.api import api_router
 from app.core.config import settings
 
-app = FastAPI(title=settings.PROJECT_NAME, openapi_url=f"{settings.API_V1_STR}/openapi.json")
+app = FastAPI(
+    title=settings.PROJECT_NAME, openapi_url=f"{settings.API_V1_STR}/openapi.json")
 
 # Set all CORS enabled origins
 # allow_origins=[str(origin) for origin in settings.BACKEND_CORS_ORIGINS],

+ 13 - 0
app/models/payment.py

@@ -0,0 +1,13 @@
+import datetime
+from sqlalchemy import Boolean, Column, String
+from sqlalchemy.sql.sqltypes import Integer, Text
+from app.db.base_class import Base
+
+
+class Payment(Base):
+    id = Column(Integer, primary_key=True, nullable=False)
+    order_id = Column(String(100), nullable=False)
+    transaction_id = Column(String(200), nullable=False)
+    payload = Column(Text(), nullable=False)
+    create_at = Column(String(200), nullable=False, default=datetime.datetime.now)
+    line_id = Column(String(200), nullable=False)

+ 2 - 1
app/schemas/__init__.py

@@ -1,4 +1,5 @@
 from .msg import Msg
 from .token import Token, TokenPayload
 from .user import *
-from .nft import *
+from .nft import *
+from .payment import *

+ 4 - 0
app/schemas/line.py

@@ -1,17 +1,21 @@
 from pydantic import BaseModel
 
+
 class TransactionNft(BaseModel):
     nftid: str
     address: str
 
+
 class BuyNft(BaseModel):
     nftid: int
     userid: str
 
+
 class NftDrops(BaseModel):
     userid: str
     email: str
 
+
 class callBack(BaseModel):
     type: str
     data: dict

+ 28 - 0
app/schemas/payment.py

@@ -0,0 +1,28 @@
+from datetime import datetime
+from typing import Optional
+from pydantic import BaseModel
+
+
+# Shared properties
+class PaymentBase(BaseModel):
+    id: Optional[str] = None
+    order_id: Optional[str] = None
+    transaction_id: Optional[str] = None
+    payload: Optional[str] = None
+    create_at: Optional[datetime] = datetime.now()
+    line_id: Optional[str] = None
+
+    class Config:
+        orm_mode = True
+
+
+class PaymentPrint(BaseModel):
+    pass
+
+
+class PaymentCreate(PaymentBase):
+    pass
+
+
+class PaymentUpdate(PaymentBase):
+    pass