如何解决当我通过Docker运行我的AWS Stripe应用程序时,为什么未检测到我的PaymentMethod ID?
我正在学习Web开发,目前正在为条纹创建Lambda测试应用程序。当我通过调用sam local start-api
在本地运行时,我的lambda函数未检测到前端的paymentMethod id。我正在基于VS Code进行开发。
我按照this页上的说明创建和运行我的应用程序。我的目录结构如下:
hello_world/app.py
具有我的Lambda函数。
在script.js
中调用lambda端点的代码如下:
var stripe = Stripe('pk_test_DIGITS');
var elements = stripe.elements();
form.addEventListener('submit',function(event) {
// We don't want to let default form submission happen here,// which would refresh the page.
event.preventDefault();
stripe.createPaymentMethod({
type: 'card',card: cardElement,billing_details: {
// Include any additional collected billing details.
name: 'Jenny Rosen',},}).then(stripePaymentMethodHandler);
});
function stripePaymentMethodHandler(result) {
if (result.error) {
// Show error in payment form
} else {
// Otherwise send paymentMethod.id to your server (see Step 4)
fetch('http://127.0.0.1:3000/payment',{
method: 'POST',headers: { 'Content-Type': 'application/json' },body: JSON.stringify({
payment_method_id: result.paymentMethod.id,})
}).then(function(result) {
// Handle server response (see Step 4)
result.json().then(function(json) {
handleServerResponse(json);
})
});
}
}
当我从浏览器中单击Pay
时,我可以在仪表板上的日志中看到响应:
以下代码用于我的lambda函数app.py
:
import json
import stripe
import requests
import logging
stripe.api_key= "sk_test_DIGITS"
def process_payment(event,context):
try:
print("START PRINTING")
print(event)
print("END PRINTING")
intent = stripe.PaymentIntent.create(
payment_method = 'event["body"]["payment_method_id"]',amount = 1555,currency = 'usd',confirmation_method = 'automatic',confirm = True,payment_method_types=["card"]
)
return {
"statusCode": 200,"body": json.dumps({
'clientSecret': intent['client_secret'],# "location": ip.text.replace("\n","")
}),}
except Exception as e:
return {
"statusCode": 400,"body": json.dumps({
"message": str(e),"")
}),}
我的template.yaml
如下:
Globals:
Function:
Timeout: 30
Resources:
StripePaymentProcessor:
Type: AWS::Serverless::Function
Properties:
CodeUri: hello_world/
Handler: app.process_payment
Runtime: python3.6
Events:
Payment:
Type: Api
Properties:
Path: /payment
Method: post
Outputs:
HelloWorldApi:
Description: "API Gateway endpoint URL for Prod stage for Payment function"
Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/payment/"
HelloWorldFunction:
Description: "Payment Lambda Function ARN"
Value: !GetAtt StripePaymentProcessor.Arn
HelloWorldFunctionIamRole:
Description: "Implicit IAM Role created for Payment function"
Value: !GetAtt StripePaymentProcessorRole.Arn
在保持浏览器窗口打开的同时,我运行了sam build
命令,它可以正常工作。之后,我运行了sam local invoke
命令,它产生了以下输出:
我不明白为什么event
为空。它应该不显示我点击“付款”按钮时生成的JSON数据吗?
要进行一些故障排除,我运行了sam local start-api
,并通过从Stripe日志中粘贴JSON正文在Postman上调用了POST
方法:
我对Postman所做的事情对我来说毫无意义,上面的代码段对我又提出了一个问题。 我不明白为什么我看到"message": "string indices must be integers"
是对邮递员的回复。
编辑:
在遵循wcw的建议之后,我将提取代码编辑为如下所示:
通过这种方式更改代码,我在控制台上看不到任何书面内容。
我正在通过命令提示符保持浏览器打开,并通过VS代码控制台运行sam local start-api
以保持http://127.0.0.1:3000/payment
打开。当我单击“付款”按钮时,收到以下响应:
因此上图似乎表明lambda函数未检测到付款方法主体。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。