我打算在社交网站上集成 Google Checkout 支付系统。这个想法是成员(member)可以用真钱购买“代币”(这是一种网站货币),然后他们可以购买访问网站上的一些额外内容等。
我想做的是创建一个 Google Checkout 按钮,将成员(member)带到他使用信用卡或借记卡付款的结帐页面。我想要的是 Google Checkout 通知我的服务器代币购买是否成功(如果信用卡/借记卡被扣款),这样我就可以更新本地数据库。
该网站使用 PHP/MySQL 编码。
我从这里下载了示例 PHP 代码:code.google.com/p/google-checkout-php-sample-code/wiki/Documentation
我知道如何创建一个 Google 结账按钮,我还在我的服务器上放置了 responsehandlerdemo.php 文件。这是 Google Checkout 应该向其发送响应的文件(当然,我在 Google 商家帐户中设置了该文件的路径)。
现在在响应处理程序文件中有一个带有多个 case 语句的 switch block 。哪一个表示支付成功,我可以在本地数据库中向成员(member)账户添加代币?
switch ($root) {
case "request-received": {
break;
}
case "error": {
break;
}
case "diagnosis": {
break;
}
case "checkout-redirect": {
break;
}
case "merchant-calculation-callback": {
// Create the results and send it
$merchant_calc = new GoogleMerchantCalculations($currency);
// Loop through the list of address ids from the callback
$addresses = get_arr_result($data[$root]['calculate']['addresses']['anonymous-address']);
foreach($addresses as $curr_address) {
$curr_id = $curr_address['id'];
$country = $curr_address['country-code']['VALUE'];
$city = $curr_address['city']['VALUE'];
$region = $curr_address['region']['VALUE'];
$postal_code = $curr_address['postal-code']['VALUE'];
// Loop through each shipping method if merchant-calculated shipping
// support is to be provided
if(isset($data[$root]['calculate']['shipping'])) {
$shipping = get_arr_result($data[$root]['calculate']['shipping']['method']);
foreach($shipping as $curr_ship) {
$name = $curr_ship['name'];
//Compute the price for this shipping method and address id
$price = 12; // Modify this to get the actual price
$shippable = "true"; // Modify this as required
$merchant_result = new GoogleResult($curr_id);
$merchant_result->SetShippingDetails($name, $price, $shippable);
if($data[$root]['calculate']['tax']['VALUE'] == "true") {
//Compute tax for this address id and shipping type
$amount = 15; // Modify this to the actual tax value
$merchant_result->SetTaxDetails($amount);
}
if(isset($data[$root]['calculate']['merchant-code-strings']
['merchant-code-string'])) {
$codes = get_arr_result($data[$root]['calculate']['merchant-code-strings']
['merchant-code-string']);
foreach($codes as $curr_code) {
//Update this data as required to set whether the coupon is valid, the code and the amount
$coupons = new GoogleCoupons("true", $curr_code['code'], 5, "test2");
$merchant_result->AddCoupons($coupons);
}
}
$merchant_calc->AddResult($merchant_result);
}
} else {
$merchant_result = new GoogleResult($curr_id);
if($data[$root]['calculate']['tax']['VALUE'] == "true") {
//Compute tax for this address id and shipping type
$amount = 15; // Modify this to the actual tax value
$merchant_result->SetTaxDetails($amount);
}
$codes = get_arr_result($data[$root]['calculate']['merchant-code-strings']
['merchant-code-string']);
foreach($codes as $curr_code) {
//Update this data as required to set whether the coupon is valid, the code and the amount
$coupons = new GoogleCoupons("true", $curr_code['code'], 5, "test2");
$merchant_result->AddCoupons($coupons);
}
$merchant_calc->AddResult($merchant_result);
}
}
$Gresponse->ProcessMerchantCalculations($merchant_calc);
break;
}
case "new-order-notification": {
$Gresponse->SendAck();
break;
}
case "order-state-change-notification": {
$Gresponse->SendAck();
$new_financial_state = $data[$root]['new-financial-order-state']['VALUE'];
$new_fulfillment_order = $data[$root]['new-fulfillment-order-state']['VALUE'];
switch($new_financial_state) {
case 'REVIEWING': {
break;
}
case 'CHARGEABLE': {
//$Grequest->SendProcessOrder($data[$root]['google-order-number']['VALUE']);
//$Grequest->SendChargeOrder($data[$root]['google-order-number']['VALUE'],'');
break;
}
case 'CHARGING': {
break;
}
case 'CHARGED': {
break;
}
case 'PAYMENT_DECLINED': {
break;
}
case 'CANCELLED': {
break;
}
case 'CANCELLED_BY_GOOGLE': {
//$Grequest->SendBuyerMessage($data[$root]['google-order-number']['VALUE'],
// "Sorry, your order is cancelled by Google", true);
break;
}
default:
break;
}
switch($new_fulfillment_order) {
case 'NEW': {
break;
}
case 'PROCESSING': {
break;
}
case 'DELIVERED': {
break;
}
case 'WILL_NOT_DELIVER': {
break;
}
default:
break;
}
break;
}
case "charge-amount-notification": {
//$Grequest->SendDeliverOrder($data[$root]['google-order-number']['VALUE'],
// <carrier>, <tracking-number>, <send-email>);
//$Grequest->SendArchiveOrder($data[$root]['google-order-number']['VALUE'] );
$Gresponse->SendAck();
break;
}
case "chargeback-amount-notification": {
$Gresponse->SendAck();
break;
}
case "refund-amount-notification": {
$Gresponse->SendAck();
break;
}
case "risk-information-notification": {
$Gresponse->SendAck();
break;
}
default:
$Gresponse->SendBadRequestStatus("Invalid or not supported Message");
break;
我猜是“CHARGED”这种情况,对吗?
第二个问题,我是否需要 SSL 证书才能接收 Google Checkout 的响应?根据这个我这样做:groups.google.com/group/google-checkout-api-php/browse_thread/thread/10ce55177281c2b0
但我没有看到官方文档中的任何地方提到它。
谢谢。
最佳答案
我在 6 个月前将其集成到我的网站中。它的音量非常低,但到目前为止效果很好。
您应该担心的第一件事是“CHARGEABLE”。这意味着信用卡已获准进行交易,但在您采取行动之前它不会实际收取资金。要发送收费请求,只需取消对 CHARGEABLE 下两行的注释即可。您可以在“设置”>“首选项”中更改您的设置,使其自动从卡中扣款,但您也可以取消对这两行的注释并让您的选项保持打开状态。
请注意,您可能希望等待“风险信息通知”,并在批准收费之前确定风险检查是否通过($data[$root]['risk-information']['eligible-for-保护']['VALUE'])。虽然,您似乎在谈论数字商品,但退款的可能性对您来说可能无关紧要。
在某些时候,我相信您还应该检查请求是否包含足够的信息,以便您在收款之前将资金链接到某个帐户,但也许这只是我的偏执狂。
我使用的另一种状态是“charge-amount-notification”。完全有可能有一种方法可以使用“CHARGED”,但我不认为“CHARGED”提供了实际收取的金额。 ($amount_charged = $data[$root]['total-charge-amount']['VALUE'];)
至于 SSL,如果您检查输入回调 URL 的位置,它说明如下: “为 Google 指定一个 URL,以通知您新订单和订单状态的更改。您必须提供运行 128 位 SSLv3 或 TLS 的服务器的 URL”
回复您的评论: 我在“new_order_notification”下执行此操作,不确定您是否可以在其他地方执行此操作。
$items = get_arr_result( $data[$root]['shopping-cart']['items']['item'] ); foreach( $items as $item ) { if( !isset ( $item['merchant-item-id']['VALUE'] ) ) { //error return; } $request_item_id = $item['merchant-item-id']['VALUE']; //save your item id with corresponding google order id for further processing }
关于php - 几个 Google Checkout 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1219117/