【发布时间】:2021-06-25 20:09:45
【问题描述】:
我有一个基于订阅的流媒体网站,我正在尝试在向用户收取月费之前实施 3 天的试用期。
须知
- 在支付页面上实现试用代码之前运行良好(即:向用户收费并自动开始订阅。Paypal IPN 显示响应)
- 我很确定我需要向侦听器添加变量,但这是我遇到问题的地方。
- 在下方提供未修改的支付代码、未修改的监听代码、未修改代码的paypal ipn响应、修改的支付代码、使用修改后的支付代码时的ipn响应
- 为了保护信息,提供的代码中的某些信息已被删除
未修改的工作支付屏幕代码
<!-- Buy button -->
<form action="{{link}}" method="post" id="paypal-form-pay">
<!-- Identify your business so that you can collect the payments -->
<input type="hidden" name="business" value="{{account}}">
<!-- Specify a subscriptions button. -->
<input type="hidden" name="cmd" value="_xclick-subscriptions">
<!-- Specify details about the subscription that buyers will purchase -->
<input type="hidden" name="item_name" value="{{subscription.pack}}">
<input type="hidden" name="item_number" value="{{id}}">
<input type="hidden" name="currency_code" value="{{subscription.currency}}">
<input type="hidden" name="a3" id="paypalAmt" value="{{subscription.price}}">
<input type="hidden" name="subscription" id="paypalAmt" value="{{subscription.id}}">
<input type="hidden" name="p3" id="paypalValid" value="1">
<input type="hidden" name="t3" value="M">
<input type="hidden" name="src" value="100">
<input type="hidden" name="sra" value="5">
<input type="hidden" name="cancel_return" value="{{ url('wep_subscription_cancel',{"id":subscription.id})}}">
<input type="hidden" name="return" value="{{ url('wep_subscription_paypal_finish',{"id":subscription.id})}}">
<input type="hidden" name="notify_url" value="{{ url('wep_subscription_notify')}}">
<input class="buy-btn" style="display:none" type="submit" value="Buy Subscription">
</form>
未修改的工作侦听器代码
$paypalURL = "https://www.paypal.com/cgi-bin/webscr";
$ch = curl_init($paypalURL);
if ($ch == FALSE) {
return FALSE;
}
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_SSLVERSION, 6);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
// Set TCP timeout to 30 seconds
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close', 'User-Agent: company-name'));
$res = curl_exec($ch);
$tokens = explode("\r\n\r\n", trim($res));
$res = trim(end($tokens));
if (strcmp($res, "VERIFIED") == 0 || strcasecmp($res, "VERIFIED") == 0) {
$txn_id = !empty($request->get('txn_id'))?$request->get('txn_id'):'';
if(!empty($txn_id)){
$payment_status = !empty($request->get('payment_status'))?$request->get('payment_status'):'';
$currency_code = $request->get('mc_currency');
$payment_gross = !empty($request->get('mc_gross'))?$request->get('mc_gross'):0;
$item_number = $request->get('item_number');
$subscription = $em->getRepository("AppBundle:Subscription")->findOneBy(array("id"=>$item_number,"method"=>"paypal","status"=>"unpaid"));
if (
$payment_status == "Completed" and
$currency_code == $subscription->getCurrency() and
$payment_gross == $subscription->getPrice()
) {
$subscr_id = $request->get('subscr_id');
$payer_email = $request->get('payer_email');
$payer_id = $request->get('payer_id');
$item_name = $request->get('item_name');
$subscription->setEmail($payer_email);
$subscription->setStatus("paid");
$subscription->setTransaction($txn_id);
$started = new \DateTime();
$expired = new \DateTime();
$expired->modify('+'.$subscription->getDuration()." day");
$subscription->setStarted($started);
$subscription->setExpired($expired);
$em->flush();
}
}
}
return new Response("done");
}
public function finishAction(Request $request,$id){
$em=$this->getDoctrine()->getManager();
$subscription = $em->getRepository("AppBundle:Subscription")->findOneBy(array("user"=>$this->getUser(),"id"=>$id));
if ($subscription == null) {
throw new NotFoundHttpException("Page not found");
}
return $this->render('WebBundle:Subscription:finish.html.twig',array("subscription"=>$subscription));
}
public function paypal_finishAction(Request $request,$id){
$em=$this->getDoctrine()->getManager();
$subscription = $em->getRepository("AppBundle:Subscription")->findOneBy(array("user"=>$this->getUser(),"id"=>$id));
if ($subscription == null) {
throw new NotFoundHttpException("Page not found");
}
return $this->render('WebBundle:Subscription:paypal_finish.html.twig',array("subscription"=>$subscription));
}
IPM 对有效的未修改代码的响应
mc_gross=0.01&protection_eligibility=Eligible&address_status=confirmed&payer_id=3H4HMXYSVLVWL&address_street=6384 flathead avenue&payment_date=11:26:19 Mar 29, 2021 PDT&payment_status=Completed&charset=windows-1252&address_zip=89122&first_name=Benjamin&mc_fee=0.01&address_country_code=US&address_name=Benjamin Halkum&notify_version=3.9&subscr_id=I-HY6W0PTGL3NB&payer_status=unverified&business=REMOVED.com&address_country=United States&address_city=Las Vegas&verify_sign=ArlJEh2PTclCmA4aNtb3eN2HF8lEAGBRRl4PvyzHc0gTKjP7ykq8080X&payer_email=REMOVED@gmail.com&txn_id=4W280838190693944&payment_type=instant&last_name=Halkum&address_state=NV&receiver_email=paypal@halkum.com&payment_fee=0.01&receiver_id=NFGUHZAMQSLPS&txn_type=subscr_payment&item_name=Test Only&mc_currency=USD&item_number=314&residence_country=US&receipt_id=0577-5054-4256-1714&transaction_subject=Test Only&payment_gross=0.01&ipn_track_id=79a7131ef33e4
修改后的付款代码试用版
<!-- Buy button -->
<form action="{{link}}" method="post" id="paypal-form-pay">
<!-- Identify your business so that you can collect the payments -->
<input type="hidden" name="business" value="{{account}}">
<!-- Specify a subscriptions button. -->
<input type="hidden" name="cmd" value="_xclick-subscriptions">
<!-- Specify details about the subscription that buyers will purchase -->
<input type="hidden" name="item_name" value="{{subscription.pack}}">
<input type="hidden" name="item_number" value="{{id}}">
<input type="hidden" name="currency_code" value="{{subscription.currency}}">
<input type="hidden" name="a1" id="paypalAmt" value="0.00">
<input type="hidden" name="subscription" id="paypalAmt" value="{{subscription.id}}">
<input type="hidden" name="p1" id="paypalValid" value="1">
<input type="hidden" name="t1" value="D">
<input type="hidden" name="currency_code" value="{{subscription.currency}}">
<input type="hidden" name="a3" id="paypalAmt" value="{{subscription.price}}">
<input type="hidden" name="subscription" id="paypalAmt" value="{{subscription.id}}">
<input type="hidden" name="p3" id="paypalValid" value="1">
<input type="hidden" name="t3" value="M">
<input type="hidden" name="src" value="100">
<input type="hidden" name="sra" value="5">
<input type="hidden" name="cancel_return" value="{{ url('wep_subscription_cancel',{"id":subscription.id})}}">
<input type="hidden" name="return" value="{{ url('wep_subscription_paypal_finish',{"id":subscription.id})}}">
<input type="hidden" name="notify_url" value="{{ url('wep_subscription_notify')}}">
<input class="buy-btn" style="display:none" type="submit" value="Buy Subscription">
</form>
修改后的代码 IPN 响应消息
amount1=0.00&amount3=6.99&address_status=unconfirmed&subscr_date=11:39:54 Mar 29, 2021 PDT&payer_id=3H4HMXYSVLVWL&address_street=REMOVED&mc_amount1=0.00&mc_amount3=6.99&charset=windows-1252&address_zip=89122&first_name=Benjamin&reattempt=1&address_country_code=US&address_name=Benjamin Halkum&notify_version=3.9&subscr_id=I-G1VY47ASJ8C4&payer_status=unverified&business=REMOVED.com&address_country=United States&address_city=Las Vegas&verify_sign=AhM9chhyQTrOGTRyOPkwcY26Rcv3AhiXC3kA9XVfl3desynG0cKTMHw4&payer_email=contact@indystars.co&last_name=Halkum&address_state=NV&receiver_email=REMOVED.com&recurring=1&txn_type=subscr_signup&item_name=Monthly*&mc_currency=USD&item_number=318&residence_country=US&period1=1 D&period3=1 M&ipn_track_id=bfcdb7a2bc514
【问题讨论】:
-
普雷斯顿在看什么方面给了我一个很好的起点。为了重新编写侦听器以说明试用期,是否有人有任何好的起点或指向处理此问题的示例的链接?我搜索了 PayPal 开发者文档。
标签: paypal