Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从Parse.com中webhook中包含的ID检索客户电子邮件_Javascript_Parse Platform_Stripe Payments_Webhooks - Fatal编程技术网

Javascript 从Parse.com中webhook中包含的ID检索客户电子邮件

Javascript 从Parse.com中webhook中包含的ID检索客户电子邮件,javascript,parse-platform,stripe-payments,webhooks,Javascript,Parse Platform,Stripe Payments,Webhooks,我有一个应用程序使用Parse.com作为后端,还有一个外部站点作为我的支付网关。收到Stripe的客户/订阅webhook数据后,我希望查找用户电子邮件,以便运行云代码功能并将其用户状态更改为“付费” 我的webhook接收器是: Parse.Cloud.define("update_user", function(request, response) { var data = request.params["data"] var customer = data.object.cus

我有一个应用程序使用Parse.com作为后端,还有一个外部站点作为我的支付网关。收到Stripe的客户/订阅webhook数据后,我希望查找用户电子邮件,以便运行云代码功能并将其用户状态更改为“付费”

我的webhook接收器是:

Parse.Cloud.define("update_user", function(request, response) {

  var data = request.params["data"]
  var customer = data.object.customer;

  response.success'Working' + request);
});
我还可以通过以下方式从客户ID中收到stripe的电子邮件:

Parse.Cloud.define("pay", function(request, response) {
Stripe.initialize(STRIPE_SECRET_KEY);
console.log(JSON.stringify(request.params));

    Stripe.Customers.retrieve(
        customerId, {
            success:function(results) {
                console.log(results["email"]);
                // alert(results["email"]);
                response.success(results);
            },
            error:function(error) {
                response.error("Error:" +error); 
            }
        }
    );
});
我需要帮助把它变成一个完整的函数,在收到Stripe的每个webhook后运行。如果出于任何原因,这种方法不起作用,我也在努力寻找备用方案

编辑

从第一个答案的一部分,我现在有:

Parse.Cloud.define("update_user", function(request, response) {
Stripe.initialize(STRIPE_SECRET_KEY);

    var data = request.params["data"]
    var customerId = data.object.customer;

    get_stripe_customer(customerId, 100).then(function(stripeResponse) {
        response.success(stripeResponse);
    }, function(error) {
        response.error(error);
    });
});

function get_stripe_customer (customerId) {
Stripe.initialize(STRIPE_SECRET_KEY);
    return Stripe.Customers.retrieve(
        customerId, {
            success:function(results) {
                console.log(results["email"]);
            },
            error:function(error) {
            }
        }
    );
};
我的知识真的落在了承诺的一边,还有回调(
成功:
错误
请求
响应
)等,希望能进一步阅读


这项功能现在可以正常工作了。

快速浏览了与stripe相关的文档,看起来步骤如下:(1)从客户端调用stripe REST api以获取令牌,(2)将该令牌传递给云函数,(3)从解析云调用stripe以完成支付。我理解您希望包括第四(4)步,其中交易记录在支付用户的数据中

从客户端(假设为JS客户端):

在服务器上:

Parse.Cloud.define("pay", function(request, response) {
    var user = request.user;
    var stripeToken = request.params.stripeToken;
    payStripeWithToken(stripeToken, 100).then(function(stripeResponse) {
        return updateUserWithStripeResult(user, stripeResponse);
    }).then(function(user) {
        response.success(user);
    }, function(error) {
        response.error(error);
    });
});
现在,我们只需要构建名为
payStripeWithToken
UpdateUserWithTripeResult
的承诺返回函数

// return a promise to pay stripe per their api
function payStripeWithToken(stripeToken, dollarAmt) {
    Stripe.initialize(STRIPE_SECRET_KEY);  // didn't see this in the docs, borrowed from your code
    return Stripe.Charges.create({
        amount: dollarAmt * 10, // expressed in cents
        currency: "usd",
        card: stripeToken  //the token id should be sent from the client
    });
    // caller does the success/error handling
}

// return a promise to update user with stripeResponse
function updateUserWithStripeResult(user, stripeResponse) {
    var transactionId = // dig this out of the stripeResponse if you need it
    user.set("paid", true);
    user.set("transactionId", transactionId);
    return user.save();
}

出于兴趣,我这样做了:

Parse.Cloud.define("update_user", function(request, response) {

    var data = request.params["data"]
    var customerId = data.object.customer;

    get_stripe_customer(customerId, 100).then(function(stripeResponse) {
        return set_user_status(username, stripeResponse);
    }).then(function(username) {
        response.success(username);
    }, function(error) {
        response.error(error);
    });
});

function get_stripe_customer (customerId) {
Stripe.initialize(STRIPE_SECRET_KEY);
    return Stripe.Customers.retrieve(
        customerId, {
            success:function(results) {
              // console.log(results["email"]);
            },
            error:function(error) {
            }
        }
    );
};

function set_user_status(stripeResponse) {

  Parse.Cloud.useMasterKey();
  var emailquery = new Parse.Query(Parse.User);
    emailquery.equalTo("username", stripeResponse['email']);  // find all the women
    return emailquery.first({
      success: function(results) {
          alert('running set_user_status success');
          var user = results;
              user.set("tier", "paid");
              user.save();
    },
      error:function(error) {
        console.log('error finding user');
    }
  });
};
有待改进

EDIT-I(@danh)将它清理了一点。请注意:

始终使用承诺。更容易阅读和处理错误

get_stripe_customer
只需要一个参数(100是我的主意,收费100美元)

set_user_status将显示
仅需要用户电子邮件作为参数,这显然是在stripeResponse中

set\u user\u status
返回保存用户的承诺。这将通过用户对象而不是用户名来实现

确保您清楚如何识别用户。stripe显然提供了电子邮件地址,但在您的用户查询中(在
设置用户状态
中),您将电子邮件与“用户名”进行比较。某些系统设置
username==email
。请确保您的用户执行或更改了该查询

Parse.Cloud.define("update_user", function(request, response) {
    var data = request.params["data"]
    var customerId = data.object.customer;

    get_stripe_customer(customerId).then(function(stripeResponse) {
        var email = stripeResponse.email;
        return set_user_status(email);
    }).then(function(user) {
        response.success(user);
    }, function(error) {
        response.error(error);
    });
});

function get_stripe_customer(customerId) {
    Stripe.initialize(STRIPE_SECRET_KEY);
    return Stripe.Customers.retrieve(customerId).then(function(results) {
        // console.log(results["email"]);
        return results;
    });
};

function set_user_status(email) {
    Parse.Cloud.useMasterKey();
    var emailquery = new Parse.Query(Parse.User);
    emailquery.equalTo("username", email);  // find all the women
    return emailquery.first().then(function(user) {
        user.set("tier", "paid");
        return user.save();
    }, function(error) {
        console.log('error finding user ' + error.message);
        return error;
    });
}

我认为你在这个问题上没有什么吸引力,因为它相当于“如何编写云函数来更新用户”?这没关系,但它需要:(a)输入的清晰性,比如用户识别功能在那一大堆JSON中的位置,(b)删除那一大堆JSON,以及(c)至少尝试一下代码——这里的门槛很低,但与这样的人交谈就像与巴黎人交谈一样。如果你试着说英语,只是声音大一点,你会被冷落,但是一次谦逊的,甚至是拙劣的法语尝试通常会给你慷慨的帮助。谢谢。。。请看我的编辑。根据parse.com上描述的使用Stripe的流程回答如下。它假设登录的用户就是付款的用户。首先,这太棒了-谢谢。然而,我可能有点想念你。我不是在我的应用程序中触发此代码-这是一个来自stripe的传入webhook,它是在外部站点上成功充值一张卡之后发出的。我只需要从Stripe获取客户电子邮件(需要回拨到Stripe)>查询解析用户的电子邮件/用户名,然后更新他们的记录。我使用电子邮件作为用户名。非常感谢您的时间、指导和代码。我相信你可以看到我在JS方面的弱点,你有什么建议可以让我在不必像大多数教程那样从头开始学习的情况下提高我的JS。很高兴为你提供帮助。看来你有了一个好的开始。我认为要走的路就是继续写作(编辑,再编辑),力求简单明了需要
var email=stripeResponse[“email”]?这些形式几乎是同义词。在大多数情况下,我选择点符号。看这里
Parse.Cloud.define("update_user", function(request, response) {
    var data = request.params["data"]
    var customerId = data.object.customer;

    get_stripe_customer(customerId).then(function(stripeResponse) {
        var email = stripeResponse.email;
        return set_user_status(email);
    }).then(function(user) {
        response.success(user);
    }, function(error) {
        response.error(error);
    });
});

function get_stripe_customer(customerId) {
    Stripe.initialize(STRIPE_SECRET_KEY);
    return Stripe.Customers.retrieve(customerId).then(function(results) {
        // console.log(results["email"]);
        return results;
    });
};

function set_user_status(email) {
    Parse.Cloud.useMasterKey();
    var emailquery = new Parse.Query(Parse.User);
    emailquery.equalTo("username", email);  // find all the women
    return emailquery.first().then(function(user) {
        user.set("tier", "paid");
        return user.save();
    }, function(error) {
        console.log('error finding user ' + error.message);
        return error;
    });
}