- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
你好,我正在开发一个 paypal 插件,可以添加响应者、添加产品。
我正在开发用于测试的沙箱。
我做响应者而不是添加产品相关的响应者。在前端,当我点击“购买”按钮时,它会转到 sandbox.paypal,在这里我完成付款程序,在我的虚拟商家帐户上我接受付款并知道发送给买家的电子邮件完成但电子邮件不是发送给我,我阅读了代码 10 遍,但我没有得到问题。
这是我的代码:
Paypal 表格:
<form name="_xclick" action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post" target="_blank">
<input type="hidden" name="cmd" value="_xclick">
<input type="hidden" name="business" value="'.$paypalID.'">
<input type="hidden" name="return" value="'.$return_url.'">
<input type="hidden" name="currency_code" value="'.$currency.'">
<input type="hidden" name="item_name" value="'.$product_name.'">
<input type="hidden" name="amount" id="p'.$product_id.'" value="'.$product_price.'">
<input type="hidden" name="custom" value="'.$responderID.'">
<input name="notify_url" value="'.plugin_dir_url( __FILE__ ).'ipn_sandbox.php" type="hidden">
<input type="image" src="'.$upload_image.'" border="0" name="submit" alt="Make payments with PayPal - its fast, free and secure!">
</form>
这是我的 ipn_sandbox.php 代码:
<?php
// STEP 1: Read POST data
// reading posted data from directly from $_POST causes serialization
// issues with array data in POST
// reading raw POST data from input stream instead.
$raw_post_data = file_get_contents('php://input');
$raw_post_array = explode('&', $raw_post_data);
$myPost = array();
foreach ($raw_post_array as $keyval) {
$keyval = explode ('=', $keyval);
if (count($keyval) == 2)
$myPost[$keyval[0]] = urldecode($keyval[1]);
}
// read the post from PayPal system and add 'cmd'
$req = 'cmd=_notify-validate';
if(function_exists('get_magic_quotes_gpc')) {
$get_magic_quotes_exists = true;
}
foreach ($myPost as $key => $value) {
if($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) {
$value = urlencode(stripslashes($value));
} else {
$value = urlencode($value);
}
$req .= "&$key=$value";
}
// STEP 2: Post IPN data back to paypal to validate
$ch = curl_init('https://www.sandbox.paypal.com/cgi-bin/webscr');
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close'));
if( !($res = curl_exec($ch)) ) {
curl_close($ch);
exit;
}
curl_close($ch);
$path = $_SERVER['DOCUMENT_ROOT'];
include_once $path . '/wp-config.php';
include_once $path . '/wp-load.php';
include_once $path . '/wp-includes/wp-db.php';
include_once $path . '/wp-includes/pluggable.php';
global $wpdb;
if (strcmp ($res, "VERIFIED") == 0) {
$item_name = $_POST['item_name'];
$item_number = $_POST['item_number'];
$payment_status = $_POST['payment_status'];
$payment_amount = $_POST['mc_gross'];
$payment_currency = $_POST['mc_currency'];
$txn_id = $_POST['txn_id'];
$receiver_email = $_POST['receiver_email'];
$payer_email = $_POST['payer_email'];
$responderID = $_POST['custom'];
$name = $_POST['first_name'];
$payment_status = $_POST['payment_status'];
$site_url = get_bloginfo('wpurl');
$table_resp = $wpdb->prefix.'paypal_responders';
$responder_to_use = $wpdb->get_row("SELECT * FROM $table_resp WHERE id ='$responderID'");
$subject = $responder_to_use->subject;
$from = $responder_to_use->from_email;
$attachment = $responder_to_use->attachment;
$att_secure = $responder_to_use->att_secure;
$message .= $responder_to_use->message_body;
$message .= '<br /><br />
<a title="Click here to download Attachment" href="'.plugin_dir_url(__FILE__).'responders/download.php?filename='.$att_secure.'" width="150" height="150" target="_blank">Click here to download Attachment</a>';
if($message){
$message = str_replace('[item_name]',$item_name,$message);
$message = str_replace('[txn_id]',$txn_id,$message);
$message = str_replace(' [mc_gross]',$payment_amount,$message);
$message = str_replace('[mc_currency]',$payment_currency,$message);
$message = str_replace('[receiver_email]',$receiver_email,$message);
$message = str_replace('[payer_email]',$payer_email,$message);
$message = str_replace('[name]',$name,$message);
$message = str_replace('[site_url]',$site_url,$message);
$message = str_replace('[payment_status]',$payment_status,$message);
}else{
$message = 'Dear '.$name.',
Thank you for your purchase from '.$site_url.'. The details of your purchase are below.
Transaction ID: '.$txn_id.'
Item Name: '.$item_name.'
Payment Amount: '.$payment_amount.'
Payment Amount: '.$payment_status.'
Paid to: '.$receiver_email.'
Thanks and Enjoy!
~Enigma Digital <br />
<br />
<a title="Click here to download Attachment" href="'.plugin_dir_url(__FILE__).'responders/download.php?filename='.$att_secure.'" width="150" height="150" target="_blank">Click here to download Attachment</a>';
}
$table = $wpdb->prefix . "paypal_transactions";
$txn_id_check = $wpdb->get_results("SELECT * FROM $table WHERE txn_id ='$txn_id'");
if(!$txn_id_check){
$data = array(
'txn_id' => $txn_id,
'product_name' => $item_name,
'product_price' => $payment_amount,
'payer_email' => $payer_email,
);
$wpdb->insert($table,$data) or die(mysql_error());
$num = md5(time());
$headers .= 'From: ' .$from. "\r\n" .'Reply-To: ' .$from . "\r\n";
$headers .= 'MIME-Version: 1.0' . "\r\n";
$headers .= "Content-Type: text/html; charset=iso-8859-1 ";
$headers .= "--".$num."--";
//mail to buyer
mail( $payer_email , $subject, $message, $headers );
}
}
?>
我也使用 wp_mail()
除了 mail()
但没有任何反应。
任何人都可以帮助解决问题。
最佳答案
代码存在一些问题,您可以做一些事情来开始调试过程。不过,您不太可能在这里得到直接的解决方案,因为这是一个开放式问题。
在执行任何操作之前,请确保 error_reporting
设置为 E^ALL
并且 display_errors
设置为 On
在您的 php.ini
中。 (Turorial, if you need it)。检查您的 error_log
- 如果存在 - 立即获得线索。
在向其附加更多数据之前,您需要声明 $message
。您开始将数据附加到第 77 行的 $message
($message .= $responder_to_use->message_body;
) 但尚未设置,这将产生警告.
现在有 3 个原因无法发送电子邮件本身:
$txn_id_check
未设置或为 false
。如果 $txn_id
不在您的数据库中,就会出现这种情况。我假设您在开始交易时添加了这一行 - 但您检查过了吗?让我们解决#1。在服务器上创建一个文件,其中只有一行会向您发送一封简单的电子邮件:
<?php mail('your@email', 'Test email', 'Yay, I can send mail!'); ?>
在浏览器中访问该文件。检查您的收件箱,并检查您的垃圾邮件。没有邮件?这就是问题所在。
下一个 #2:这可能是在用户访问 PayPal 之前将交易添加到数据库的脚本的问题。我们没有此代码,但您可以轻松检查 - 只需检查数据库以查看是否存在任何行。
#3:这里应该很容易检查语法错误,只需直接在浏览器中访问 IPN 脚本即可。将向您显示 fatal error 。
还是不行?其他地方可能有问题。最好的检查方法是进行一些基本的调试...
首先通过电子邮件将完整的 $_POST
数组发送给您自己,就在脚本的顶部。
<?php
mail('your@email', 'Full Post Data - '.time(), print_r($_REQUEST, true));
// STEP 1: Read POST data
// reading posted data from directly from $_POST causes serialization
// issues with array data in POST
// reading raw POST data from input stream instead.
$raw_post_data = file_get_contents('php://input');
$raw_post_array = explode('&', $raw_post_data);
[...]
最后将脚本的输出通过电子邮件发送给自己。
<?php
ob_start();
$time = time(); // Referenced in your email subjects. It will get confusing with lots of these emails otherwise. Gmail and other clients who use a conversation view will properly catalogue these emails if the subjects match.
mail('your@email', 'Full Post Data - '.$time, print_r($_REQUEST, true));
// STEP 1: Read POST data
// reading posted data from directly from $_POST causes serialization
// issues with array data in POST
// reading raw POST data from input stream instead.
[...] // Rest of your script here...
$output_buffer = ob_get_contents();
ob_end_clean();
mail('your@email', 'Output buffer - '.$time, $output_buffer);
?>
关于php - 电子邮件不使用sandox ipn发送给 Paypal 中的买家,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25662843/
我正在测试 paypal 的支付流程。我正在使用 Paypal Website Payment Pro 解决方案。PayPal 交易完成后,PayPal 会显示此付款成功消息: Thanks for
我是一名优秀的程序员,十分优秀!