Withdraw payment gateway PayUMoney

I need to integrate PayUMoney payment gateway in my iOS application. They do not have an SDK for iOS. So I have to upload some web url in webview for payment. My parameters

int i = arc4random() % 9999999999; NSString *strHash = [self createSHA512:[NSString stringWithFormat:@"%d%@",i,[NSDate date]]];// Generatehash512(rnd.ToString() + DateTime.Now); NSString *txnid1 = [strHash substringToIndex:20]; NSLog(@"tnx1 id %@",txnid1); NSString *key = @"JBZaLc"; NSString *amount = @"1000"; NSString *productInfo = @"Nice product"; NSString *firstname = @"Mani"; NSString *email = @" mani.ingenius@gmail.com "; NSString *phone = @"1234566"; NSString *surl = @"www.google.com"; NSString *furl = @"www.google.com"; NSString *serviceprovider = @"payu_paisa"; NSString *action = @"https://test.payu.in/_payment"; NSString *hashValue = [NSString stringWithFormat:@"%@|%@|%@|%@|%@|%@|udf1|udf2|udf3|udf4|udf5||||||salt",key,txnid1,amount,productInfo,firstname,email]; NSString *hash = [self createSHA512:hashValue]; NSDictionary *parameters = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:txnid1,key,amount,productInfo,firstname,email,phone,surl,furl,hash,serviceprovider,action, nil] forKeys:[NSArray arrayWithObjects:@"txnid",@"key",@"amount",@"productinfo",@"firstname",@"email",@"phone",@"surl",@"furl",@"hash",@"service_provider",@"action", nil]]; 

I need to use the POST method with my test URL ( https://test.payu.in/_payment ) and you need to pass parameters. I have all the parameters with the key and value in the dictionary ("parameters"). So I tried the following code

  NSData *dataValue = [self getPropertiesAsData:parameters]; NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://test.payu.in/_payment"]]; // Create a mutable copy of the immutable request and add more headers NSMutableURLRequest *mutableRequest = [request mutableCopy]; [mutableRequest setHTTPMethod: @"POST"]; [mutableRequest setHTTPBody: dataValue]; request = [mutableRequest copy]; [_webviewSample loadRequest:request]; -(NSData *)getPropertiesAsData :(NSDictionary *)dict{ NSMutableData *body = [NSMutableData postData]; [dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { [body addValue:[obj stringByReplacingOccurrencesOfString:@" " withString:@"%20"] forKey:key]; }]; return body; } -(NSString *)createSHA512:(NSString *)string { const char *cstr = [string cStringUsingEncoding:NSUTF8StringEncoding]; NSData *data = [NSData dataWithBytes:cstr length:string.length]; uint8_t digest[CC_SHA512_DIGEST_LENGTH]; CC_SHA512(data.bytes, data.length, digest); NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA512_DIGEST_LENGTH * 2]; for(int i = 0; i < CC_SHA512_DIGEST_LENGTH; i++) [output appendFormat:@"%02x", digest[i]]; return output; } 

But when I run this, he says: "The required tnxid parameter is missing." But I passed tnxid, which you can see in the parameter dictionary. If I pass everything correctly, the result will be a web page on which the user can select bank details, etc., which I have to upload in my web view.

Please help me find what I did wrong, or what I have to do to get the right result.

+6
source share
4 answers

I found the answer successfully. Below is my working code

 int i = arc4random() % 9999999999; NSString *strHash = [self createSHA512:[NSString stringWithFormat:@"%d%@",i,[NSDate date]]];// Generatehash512(rnd.ToString() + DateTime.Now); NSString *txnid1 = [strHash substringToIndex:20]; NSLog(@"tnx1 id %@",txnid1); NSString *key = @"JBZaLc"; NSString *amount = @"1000"; NSString *productInfo = @"Nice product"; NSString *firstname = @"Mani"; NSString *email = @" mani.ingenius@gmail.com "; NSString *phone = @"1234566"; NSString *surl = @"www.google.com"; NSString *furl = @"www.google.com"; NSString *serviceprovider = @"payu_paisa"; NSString *hashValue = [NSString stringWithFormat:@"%@|%@|%@|%@|%@|%@|||||||||||GQs7yium",key,txnid1,amount,productInfo,firstname,email]; NSString *hash = [self createSHA512:hashValue]; NSDictionary *parameters = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:txnid1,key,amount,productInfo,firstname,email,phone,surl,furl,hash,serviceprovider , nil] forKeys:[NSArray arrayWithObjects:@"txnid",@"key",@"amount",@"productinfo",@"firstname",@"email",@"phone",@"surl",@"furl",@"hash",@"service_provider", nil]]; __block NSString *post = @""; [parameters enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { if ([post isEqualToString:@""]) { post = [NSString stringWithFormat:@"%@=%@",key,obj]; }else{ post = [NSString stringWithFormat:@"%@&%@=%@",post,key,obj]; } }]; NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; NSString *postLength = [NSString stringWithFormat:@"%lu",(unsigned long)[postData length]]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; [request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://test.payu.in/_payment"]]]; [request setHTTPMethod:@"POST"]; [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Current-Type"]; [request setHTTPBody:postData]; [_webviewSample loadRequest:request]; 

the functions to be used

 -(NSString *)createSHA512:(NSString *)string { const char *cstr = [string cStringUsingEncoding:NSUTF8StringEncoding]; NSData *data = [NSData dataWithBytes:cstr length:string.length]; uint8_t digest[CC_SHA512_DIGEST_LENGTH]; CC_SHA512(data.bytes, (CC_LONG)data.length, digest); NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA512_DIGEST_LENGTH * 2]; for(int i = 0; i < CC_SHA512_DIGEST_LENGTH; i++) [output appendFormat:@"%02x", digest[i]]; return output; } 
+10
source

Finally, I solved the problem regarding PayU India (not payU, payU and payUindia have a slight difference, as mentioned) integration (above code for payU Money help alot) Download github Repo here

You only need to remove the additional parameter, which is service_provider, whose value is equal to payu_paisa.

 int i = arc4random() % 9999999999; NSString *strHash = [self createSHA512:[NSString stringWithFormat:@"%d%@",i,[NSDate date]]];// Generatehash512(rnd.ToString() + DateTime.Now); NSString *txnid1 = [strHash substringToIndex:20]; NSLog(@"tnx1 id %@",txnid1); NSString *key = @"YOURKEY"; NSString *salt = @"YOURSALTKEY"; NSString *amount = @"100"; NSString *productInfo = @"Niceproduct"; NSString *firstname = @"Deepak"; NSString *email = @" iphonemaclover@gmail.com "; NSString *phone = @"9212138007"; NSString *surl = @"www.google.com"; NSString *furl = @"www.google.com"; NSString *hashValue = [NSString stringWithFormat:@"%@|%@|%@|%@|%@|%@|||||||||||%@",key,txnid1,amount,productInfo,firstname,email,salt]; NSString *hash = [self createSHA512:hashValue]; NSDictionary *parameters = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:txnid1,key,amount,productInfo,firstname,email,phone,surl,furl,hash , nil] forKeys:[NSArray arrayWithObjects:@"txnid",@"key",@"amount",@"productinfo",@"firstname",@"email",@"phone",@"surl",@"furl",@"hash", nil]]; __block NSString *post = @""; [parameters enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { if ([post isEqualToString:@""]) { post = [NSString stringWithFormat:@"%@=%@",key,obj]; }else{ post = [NSString stringWithFormat:@"%@&%@=%@",post,key,obj]; } }]; NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; NSString *postLength = [NSString stringWithFormat:@"%lu",(unsigned long)[postData length]]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; [request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://test.payu.in/_payment"]]]; [request setHTTPMethod:@"POST"]; [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Current-Type"]; [request setHTTPBody:postData]; [_webviewSample loadRequest:request]; 

EDIT: how to process payment by URL is successful or not

 -(void)webViewDidFinishLoad:(UIWebView *)webView{ if (web_view_PayU.isLoading) return; NSURL *requestURL = [[web_view_PayU request] URL]; NSLog(@"requestURL=%@",requestURL); NSString *getStringFromUrl=[NSString stringWithFormat:@"%@",requestURL]; if ([getStringFromUrl isEqualToString:@"https://test.payu.in/yoursucessurladdedhere "]||[getStringFromUrl isEqualToString:@"https://secure.payu.in/yoursucessurladdedhere "]) { //SUCCESS ALERT //jump to place order API } else if ([getStringFromUrl isEqualToString:@"https://test.payu.in/yourfailureurladdedhere "]||[getStringFromUrl isEqualToString:@"https://secure.payu.in/yourfailureurladdedhere"]) { // FAIL ALERT UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"Sorry!" message:@"Your Order Not Successfull!" delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil]; alert.tag=2222; [alert show]; } } 

For Android Integration Pay U Check Link -

+5
source

I sent an email to the PayUMoney Technical team and received an answer why I get the error message "Sorry, there was some problem."

Got a quick response for the technical team:

 Recently, we have done some modifications in test environment due to which test key-JBZaLc and salt-GQs7yium will not work anymore. In order to test the gateway using a test key and salt, kindly follow these steps: 1 - Go on https://test.payumoney.com 2 - Sign up as a merchant - use any of your valid email ids - kindly do not use a random email id. 3 - Complete the "Business Details" - you may use PAN no. ABCDE1234F and DOB - 01/04/1990 4 - Complete "Bank Account Details" (You may use IFSC- ALLA0212632) 5 - Go to below mentioned location to get the Test Merchant Id : Seller Dashboard -> Settings -> My account -> Profile Settings Once you provide your test merchant id, we will approve it so that you can find your test key and salt at : Seller Dashboard -> Settings -> My account -> Merchant Key - Salt 

Download Github Repository

+4
source

For quick version

1) import to header header

** import CommonCrypto / CommonDigest.h **

2) after

 func sha512Hex( string: String) -> String { var digest = [UInt8](repeating: 0, count: Int(CC_SHA512_DIGEST_LENGTH)) if let data = string.data(using: String.Encoding.utf8) { let value = data as NSData CC_SHA512(value.bytes, CC_LONG(data.count), &digest) } var digestHex = "" for index in 0..<Int(CC_SHA512_DIGEST_LENGTH) { digestHex += String(format: "%02x", digest[index]) } return digestHex } 

3) install pod PlugNPlay

4) after completing the next step, provided that PlugNPlay

0
source

Source: https://habr.com/ru/post/980862/


All Articles