2012-01-02 232 views
3

我正在发送请求与请求正文中的某个参数。使用NSURLConnection发送POST请求

这里是iOS的代码:

NSURL *url = [NSURL URLWithString:purchaseURL]; 

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
NSString *requestString = [NSString stringWithString:@"userid=1&couponid=1&Ccnum=7b6cd9a44365752cf39c1edf97890b72&Cctype=Visa&Cvv=434&Billingfirstname=Ankit&Billinglastname=Ankit&Street=some&getCity=mycity&State=mystate&getZip=54355&Ccexpmonth=5&Ccexpyear=2012&Phone=43423342"]; 
NSMutableData *postData=[NSMutableData data]; 
[postData appendData:[requestString dataUsingEncoding:NSUTF8StringEncoding]]; 

[request setHTTPMethod:@"POST"]; 
[request setValue:[NSString stringWithFormat:@"%d", [postData length]] forHTTPHeaderField:@"Content-Length"]; 
[request addValue:@"application/json" forHTTPHeaderField:@"Accept"]; 

NSLog(@"content length %d",[postData length]); 
[request setValue:@"text/html" forHTTPHeaderField:@"Content-Type"]; 
[request setHTTPBody:postData]; 


NSLog(@"purchage url string %@",postData); 

connection=[[NSURLConnection alloc] initWithRequest:request delegate:self]; 


    NSAssert(self.connection != nil, @"Failure to create URL connection."); 

这是PHP文件,将处理后的请求。它处理输入并且响应采用JSON格式。

public function restpurchaseAction(Request $request) 
{ 

    $userid = $_POST['userid']; 
    $couponid = $POST['couponid']; 



    //Check that email was verified 
//Get the user object to compare id to the listed deals id 
if(!$user->getEmailVerified()) 
{ 
    return "Error: Must verify email before making a purchase."; 
} 


// Initialize error varible 
$error = ""; 


//get the currently logged in user 
$repository = $this->getDoctrine() 
     ->getRepository('FrontendUserBundle:User'); 
     $user = $repository->findOneByUsername($userid); 
//get the coupon that is being purchased 
$repository = $this->getDoctrine() 
    ->getRepository('FrontendUserBundle:Coupon'); 
    $coupon = $repository->findOneById($couponid);   

//get the number of times the user has purchased and compare to maxper 
$repository = $this->getDoctrine() 
->getRepository('FrontendUserBundle:Purchase');  
//if they have already purchased max, redirect to error page 
$purchases = $repository->findByCouponAndUser($coupon->getId(), $user->getId()); 
if(count($purchases) >= $coupon->getMaxper() && $coupon->getMaxper() != 0){ 
    "Error: Coupon purchased maximum number of times."; 
} 

//get the users profile 
$profile = $user->getProfile(); 

//get the users address 
$address = $profile->getAddress(); 

//initialize the new purchase 
$purchase = new Purchase(); 

//generate the coupon verification code 
$currentdate = new \DateTime(); 
$currentdate->setTimestamp(time()); 
$interval = new \DateInterval('P'.$coupon->getExpirationdate().'D'); 
$currentdate->add($interval); 
$validationnumber1 = mt_rand(1000000, 9999999); 
$validationnumber2 = mt_rand(1000000, 9999999); 
$validationnumber = $validationnumber1 . $validationnumber2; 

//set up all the values for the purchase object 
$purchase->setValidationnumber($validationnumber); 
$purchase->setUser($user); 
$purchase->setCoupon($coupon); 
$purchase->setValid(true); 
$purchase->setValidationattempts(1); 
$purchase->setExpirationDate($currentdate); 
$card = $purchase->getCard(); 
$card->setCcnum($_POST['Ccnum']); 
$card->setCctype($_POST['Cctype']); 
$card->setCvv($_POST['Cvv']); 
$card->setUserid($user->getId()); 

//If the form has already been submitted then check if it is a valid CC. 
//If so, then finish the purchase,else return to the start. 
if($request->getMethod() == 'POST'){ 
    //Get post variables for credit card. 

     //Live Mode Credentials 
     define("AUTHORIZENET_API_LOGIN_ID", "**********"); 
     define("AUTHORIZENET_TRANSACTION_KEY", "***************"); 
     //Test Mode Credentials 
     //define("AUTHORIZENET_API_LOGIN_ID", "*************"); 
     //define("AUTHORIZENET_TRANSACTION_KEY", "*****************"); 
     define("AUTHORIZENET_SANDBOX", false); 
     $response="declined"; 

     //Make sure maxlimit hasn't been reached before processing. 
     if($coupon->getMaxLimit() == 0 || $coupon->getNumPurchased()<=$coupon-                                  >getMaxLimit()) 
     { 

     $sale = new AuthorizeNetAIM; 

     /*Input coupon information. */ 
     $item_id = $coupon->getID(); 
     $item_name = substr($coupon->getCouponname(), 0, 31); 
     $item_description = substr($coupon->getDescription(), 0,255); 
     $item_quantity = 1; 
     $item_unit_price = $coupon->getPrice(); 
     $item_taxable = FALSE; 
     $billingaddress = $purchase->getBillingaddress(); 
     $card = $purchase->getCard(); 

     /*Input customer information. */ 
     $sale->setField('first_name', $_POST['Billingfirstname']); 
     $sale->setField('last_name', $_POST['Billinglastname']); 
     $sale->setField('email', $user->getEmail); 
     $sale->setField('address', $_POST['Street']); 
     $sale->setField('city', $_POST['getCity']); 
     $sale->setField('state', $_POST['State']); 
     $sale->setField('zip', $_POST['getZip']); 
     $sale->setField('phone', $_POST['Phone']); 


     /*Add information to the sale */ 
     $sale->addLineItem($item_id, $item_name, $item_description, $item_quantity, $item_unit_price, $item_taxable); 
     $sale->amount = $coupon->getPrice(); 
     $sale->card_num = $_POST['Ccnum']; 
     $sale->exp_date = $_POST['Ccexpmonth'] . '/' . $_POST['Ccexpyear']; 
     $sale->setField('card_code', $_POST['Cvv']); 

     $response = $sale->authorizeAndCapture(); 
     if ($response->approved) { 
      //Prepersist, make sure to remove CVV, and extra CC digits, only store last 4 
      $card->setCvv(""); 
      $lastfour = substr($card->getCcnum(), -4); 
      $card->setCcnum($lastfour); 
      $transaction_id = $response->transaction_id; 
      $purchase->setId = $transaction_id; 
      $coupon->incrementNumPurchased(); 
      $em = $this->get('doctrine')->getEntityManager(); 
      $em->persist($purchase); 
      $em->persist($coupon); 
      $em->flush(); 
      return "Coupon Purchase Successful!"; 

    }else{ 

     $error = $response->error_message; 
    } 
    } 
    else{ 

     $error = "Maximum number of coupons already purchased!"; 

    } 

} 

return $error; 


} 

我无法找到错误或代码中的任何问题。我也尝试了ASIHttpRequest/ASIFormDataRequest,但无法让它工作。我在调用Web服务的方式有问题吗?

+3

欢迎来到SO - 您的问题,因为它目前的立场是不容易回答,因为你正在张贴的PHP代码续墙发现了很多不相关的东西。您也不会告诉我们发布数据的结果。你有没有试图简单地在服务器端登录整篇文章来查看收到的内容?您是否尝试过使用代理(例如Charles)来监控设备和服务器之间的通信? – Till 2012-01-02 12:46:03

+0

我不确定,但尝试使用NSASCIIStringEncoding替换NSUTF8StringEncoding ... – 2012-01-02 12:50:39

+0

**等待!**您直接在其单个POST请求中发送信用卡号码及其CCV和失效日期?它可能不符合PCI DSS标准。 – Raptor 2013-05-24 04:09:12

回答

1

最简单的调试方法是实际检查启动连接时得到的错误或响应。要做到这一点,我建议你让你的类实现以下的委托方法:

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ 
    NSLog(@"Did fail with error %@" , [error localizedDescription]); 
} 

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ 
    NSHTTPURLResponse *httpResponse; 
    httpResponse = (NSHTTPURLResponse *)response; 
    int statusCode = [httpResponse statusCode]; 
    NSLog(@"Status code was %d", statusCode); 
} 

希望这将让你发生了什么更好的主意。希望它能帮助:)

+0

约翰,先生,我已经试过使用它,它返回我404 – ankit 2012-01-02 13:01:32

+0

@ankit请参阅http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html – Till 2012-01-02 13:12:51

+0

好吧,所以404是从服务器返回的HTTP状态代码所以HTTP-post被成功发送到服务器。 在服务器端,尝试记录请求参数,并找出为什么它返回404到客户端。 – 2012-01-02 13:19:04

0

下面尝试,它可以帮助你......

NSString *[email protected]"your url string inside"; 

NSString *postString=[NSString stringWithFormat:@"userid=1&couponid=1&Ccnum=7b6cd9a44365752cf39c1edf97890b72&Cctype=Visa&Cvv=434&Billingfirstname=Ankit&Billinglastname=Ankit&Street=some&getCity=mycity&State=mystate&getZip=54355&Ccexpmonth=5&Ccexpyear=2012&Phone=43423342"]; 

NSData *postData=[postString dataUsingEncoding:NSUTF8StringEncoding]; 

NSURL *url = [NSURL URLWithString:purchaseURL]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 

[request setHTTPMethod:@"POST"]; 
[request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
[request setHTTPBody:postData]; 
[request setValue:[NSString stringWithFormat:@"%i",postData.length] forHTTPHeaderField:@"Content-Length"]; 
[request setHTTPShouldHandleCookies:YES]; 
[request setTimeoutInterval:30]; 
[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; 

NSError *err=nil; 

NSData *responseData=[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&err]; 
NSString *responseString=[[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 

NSLog(@"response String is %@",responseString); 

如果仍然会给一些错误尝试改变后的字符串下面

NSMutableDictionary *postDix=[[NSMutableDictionary alloc] init]; 
[postDix setValue:@"1" forKey:@"userid"]; 
[postDix setValue:@"7b6cd9a44365752cf39c1edf97890b72" forKey:@"Ccnum"]; 
[postDix setValue:@"Visa" forKey:@"Cctype"]; 
[postDix setValue:@"434" forKey:@"Cvv"]; 
[postDix setValue:@"Ankit" forKey:@"Billingfirstname"]; 
[postDix setValue:@"Ankit" forKey:@"Billinglastname"]; 
[postDix setValue:@"some" forKey:@"Street"]; 
[postDix setValue:@"mycity" forKey:@"getCity"]; 
[postDix setValue:@"mystate" forKey:@"State"]; 
[postDix setValue:@"54355" forKey:@"getZip"]; 
[postDix setValue:@"5" forKey:@"Ccexpmonth"]; 
[postDix setValue:@"2012" forKey:@"Ccexpyear"]; 
[postDix setValue:@"43423342" forKey:@"Phone"]; 

NSString *postString=[NSString stringWithFormat:@"%@", postDix]; 

或更改后的数据作为给定作为: -

NSMutableDictionary *postDix=[[NSMutableDictionary alloc] init]; 
[postDix setValue:@"1" forKey:@"userid"]; 
[postDix setValue:@"7b6cd9a44365752cf39c1edf97890b72" forKey:@"Ccnum"]; 
[postDix setValue:@"Visa" forKey:@"Cctype"]; 
[postDix setValue:@"434" forKey:@"Cvv"]; 
[postDix setValue:@"Ankit" forKey:@"Billingfirstname"]; 
[postDix setValue:@"Ankit" forKey:@"Billinglastname"]; 
[postDix setValue:@"some" forKey:@"Street"]; 
[postDix setValue:@"mycity" forKey:@"getCity"]; 
[postDix setValue:@"mystate" forKey:@"State"]; 
[postDix setValue:@"54355" forKey:@"getZip"]; 
[postDix setValue:@"5" forKey:@"Ccexpmonth"]; 
[postDix setValue:@"2012" forKey:@"Ccexpyear"]; 
[postDix setValue:@"43423342" forKey:@"Phone"]; 

NSMutableData *postData = [[NSMutableData alloc] init]; 
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:postData]; 
[archiver encodeObject:postDix forKey:@"json"]; 
[archiver finishEncoding];