Adding a Payment Card for Flash Funds

 
The first step in integrating Flash Funds, for your merchants, is to give each of them the opportunity to attach a debit card to their ProPay account.  ProPay’s API does NOT allow you to specify the destination card each time you initiate a Flash Funds transaction.  You first need to update the account, at which point we ping Visa to make sure Flash Funds is going to work.  We also maintain a record of changes to Flash Funds destinations as part of our efforts to prevent money-laundering.
How to call this method?

Example Request

Example Response

Implementation Details
Request Submission

Response Handling

Request Submission

Response Handling

Request Submission

Response Handling

Request Submission

Response Handling

Request Values
Response Values
How to call this method?

You should submit a post of XML data to the following URL
 
HTTP URL(s)
Example Request

Example Response

<?xml version='1.0'?>
<!DOCTYPE Request.dtd>
<XMLRequest>
<certStr>My certStr</certStr>
<class>partner</class>
<XMLTrans>
<transType>209</transType>
<accountNum>123456</accountNum>
<ccNum>4747474747474747</ccNum>
<expDate>0471</expDate>
<cardholderName>Porky Pig</cardholderName>
<streetAddress>3400 Ashton Blvd</streetAddress>
<state>UT</state>
<ZipCode>
</XMLTrans>
</XMLRequest>
<XMLResponse>
<XMLTrans>
<transType>209</transType>
<accountNum>123456</accountNum>
<status>00</status>
</XMLTrans>
</XMLResponse>
Implementation Details
Request Submission

namespace MSAPI_ProcessTransaction
 {
 using System;
 using System.Collections.Generic;
 using System.IO;
 using System.Linq;
 using System.Net;
 using System.Text;
 using System.Xml;
 using System.Xml.Linq;
 using System.Xml.Serialization;


/*
 ProPay provides the following code “AS IS.”
ProPay makes no warranties and ProPay disclaims all warranties and conditions, express, implied or statutory,
 including without limitation the implied warranties of title, non-infringement, merchantability, and fitness for a particular purpose.
 ProPay does not warrant that the code will be uninterrupted or error free,
 nor does ProPay make any warranty as to the performance or any results that may be obtained by use of the code.
 */
 public class ProcessTransactionTransType209
 {
 public static void ProcessTransaction()
 {
 var processRequest = new XmlTransactionRequest { CertificationString = "YourCertStringGoesHere", TerminalID = "YourTermId", };
 var xmlTransaction = new XmlProcessTransaction
 {
 TransType = "209",
 accountNum = "12345678",
 ccNum = "4747474747474747",
 expDate = "1021",
 cardholderName = "Tester McTest",
 streetAddress = "3400 Ashton Blvd",
 state = "UT",
 ZipCode = "84043",
 };
 processRequest.Transactions.Add(xmlTransaction);
 string request = XmlSerializer<XmlTransactionRequest>.WriteToString(processRequest);
 SubmitRequest(request);
 }

private static void SubmitRequest(string request)
 {
 byte[] dataToSend = Encoding.UTF8.GetBytes(request);

// Change the following URL to point to production instead of integration
 WebRequest webRequest = WebRequest.Create("https://xmltest.propay.com/API/PropayAPI.aspx");
 webRequest.Method = "POST";
 webRequest.ContentLength = dataToSend.Length;
 webRequest.ContentType = "text/xml";
 webRequest.Headers.Add("X509Certificate", GetBase64Cert(“your certificate thumbprint goes here”));
 webRequest.ProtocolVersion = HttpVersion.Version10;
 Stream dataStream = webRequest.GetRequestStream();
 dataStream.Write(dataToSend, 0, dataToSend.Length);
 dataStream.Close();

string response = string.Empty;

try
 {
 WebResponse apiResponse = webRequest.GetResponse();


using (StreamReader sr = new StreamReader(apiResponse.GetResponseStream()))
 {
 response += sr.ReadToEnd();
 }
 }
 catch (WebException wex)
 {
 HttpWebResponse httpResponse = wex.Response as HttpWebResponse;
 using (Stream responseStream = httpResponse.GetResponseStream())
 using (StreamReader reader = new StreamReader(responseStream))
 {
 response = reader.ReadToEnd();
 }
 }

 ParseResponse(response);
 }

private static void ParseResponse(string response)
 {
 var load = XDocument.Parse(response);
 var transType = Convert.ToInt32(load.Descendants().First(p => p.Name.LocalName == "transType").Value);
 var status = load.Descendants().First(p => p.Name.LocalName == "status").Value;
 var accountNum = load.Descendants().First(p => p.Name.LocalName == "accountNum").Value;
 }
 }

public class XmlProcessTransaction : XmlTransaction
 {
 [XmlElement("accountNum")]
 public string accountNum = string.Empty;
 [XmlElement("ccNum")]
 public string ccNum = string.Empty;
 [XmlElement("expDate")]
 public string expDate = string.Empty;
 [XmlElement("cardholderName")]
 public string cardholderName = string.Empty;
 [XmlElement("streetAddress")]
 public string streetAddress = string.Empty;
 [XmlElement("state")]
 public string state = string.Empty;
 [XmlElement("ZipCode")]
 public string ZipCode = string.Empty;

 }

public static class XmlSerializer<T>
 {
 public static XmlSerializer Serializer = new XmlSerializer(typeof(T));
 public static string WriteToString(T data)
 {
 return WriteToString(data, Encoding.UTF8);
 }
 public static string WriteToString(T data, Encoding encoding)
 {
 string retVal;
 using (MemoryStream memoryStream = new MemoryStream())
 {
 using (XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, encoding))
 {
 Serializer.Serialize(xmlTextWriter, data);
 }

retVal = encoding.GetString(memoryStream.ToArray());
 }

return retVal;
 }
 }

[XmlInclude(typeof(XmlProcessTransaction))]
 public class XmlTransaction
 {
 [XmlElement("transType")]
 public string TransType = string.Empty;
 }
 [XmlRoot("XMLRequest")]
 public class XmlTransactionRequest
 {
 [XmlElement("certStr")]
 public string CertificationString = string.Empty;
 [XmlElement("termid")]
 public string TerminalID = string.Empty;
 [XmlElement("XMLTrans")]
 public List<XmlTransaction> Transactions = new List<XmlTransaction>();
 }

public string GetBase64Cert(string certificateThumbprint)
  {
  using (X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine))
  {
  store.Open(OpenFlags.ReadOnly);
  var foundCertificates = store.Certificates.Find(X509FindType.FindByThumbprint, certificateThumbprint, false);
  if (foundCertificates.Count != 1)
  {
  return null;
  }
  var certByteArray = foundCertificates[0].Export(X509ContentType.Cert);
  store.Close();
  return Convert.ToBase64String(certByteArray);
  }
 }

Response Handling

Request Submission

/**
 * ProPay provides the following code “AS IS.” ProPay makes no warranties and
 * ProPay disclaims all warranties and conditions, express, implied or
 * statutory, including without limitation the implied warranties of title,
 * non-infringement, merchantability, and fitness for a particular purpose.
 * ProPay does not warrant that the code will be uninterrupted or error free,
 * nor does ProPay make any warranty as to the performance or any results that
 * may be obtained by use of the code.
 */

 

<?php
class ProPayApi
{
/* change this to the production url for going live after testing https://api.propay.com */
private $_apiBaseUrl = 'https://xmltestapi.propay.com';

/* for xml */
/** @var \SimpleXMLElement */
private $_xmlRequestObject;
/** @var \SimpleXMLElement */
private $_xmlResponseObject;
/** @var string */
private $_xmlUrl;

/**
* sets the xml request object
* @param string $xmlData - containing XML
* @return $this
*/
public function setXMLRequestData($xmlData) {
$this->_xmlRequestObject = simplexml_load_string($xmlData);
return $this;
}

/**
* @param string $xmlData - containing XML
* @return $this
*/
public function setXMLResponseData($xmlData) {
$this->_xmlResponseObject = simplexml_load_string($xmlData);
return $this;
}

/**
* @return mixed
*/
public function getXMLRequestObject() {
return $this->_xmlRequestObject;
}

/**
* @return mixed
*/
public function getXMLResponseObject() {
return $this->_xmlResponseObject;
}

/**
* @param \SimpleXMLElement $xmlObject
* @return $this
*/
public function setXMLRequestObject(\SimpleXMLElement $xmlObject) {
$this->_xmlRequestObject = $xmlObject;
return $this;
}

/**
* @param \SimpleXMLElement $xmlObject
* @return $this
*/
public function setXMLResponseObject(\SimpleXMLElement $xmlObject) {
$this->_xmlResponseObject = $xmlObject;
return $this;
}

/**
* sets the url for the XML request
* @param string $xmlUrl
* @return $this
*/
public function setXMLUrl($xmlUrl) {
$this->_xmlUrl = $xmlUrl;
return $this;
}

/**
* creates custom header value by pulling array from x509 certificate file and converting to base64
* @param string $x509file
* @return $this
*/
public function setx509($x509file) {
$cert = openssl_x509_parse($x509file);
$base64cert = base64_encode($cert);
return $base64cert;
}

/**
* posts XML to the server
* @return $this
*/
public function postXML() {
$header = [
"Content-type:text/xml; charset=\"utf-8\"",
"Accept: text/xml",
"X509Certificate: ".setx509([Put your certificate file name here])
];

$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $this->_xmlUrl,
CURLOPT_TIMEOUT => 30,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $this->_xmlRequestObject->asXML(),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => $header,
CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_SSL_VERIFYHOST => 0,
CURLOPT_HTTPAUTH => CURLAUTH_ANY
]);
$result = curl_exec($curl);
$this->_xmlResponseObject = simplexml_load_string($result);
curl_close($curl);
return $this;
}
}

$proPayAPI = new ProPayApi();
$data = "<?xml version='1.0'?>
<!DOCTYPE Request.dtd>
<XMLRequest>
</XMLRequest>";
$simpleXML = new \SimpleXMLElement($data);
$simpleXML->addChild('certStr','cert string here');
$simpleXML->addChild('termId','terminal id here');
$simpleXML->addChild('class','partner');
$simpleXML->addChild('XMLTrans');
$simpleXML->XMLTrans->addChild('transType', 209);
$simpleXML->XMLTrans->addChild('accountNum', 123456789);
$simpleXML->XMLTrans->addChild('ccNum', '4747474747474747');
$simpleXML->XMLTrans->addChild('expDate', '1219');
$simpleXML->XMLTrans->addChild('cardholderName', 'TesterMcTest');
$simpleXML->XMLTrans->addChild('streetAddress', '3400 Ashton Blvd');
$simpleXML->XMLTrans->addChild('state', 'UT');
$simpleXML->XMLTrans->addChild('zipCode', '84043');

// returns XML
$result =
$proPayAPI->setXMLUrl('https://xmltest.propay.com/API/PropayAPI.aspx')
->setXMLRequestData($simpleXML->asXML())
->postXML()
->getXMLResponseObject()->asXML();

// if you prefer a simpleXML object you just retrieve the object back to work with that
$result = $proPayAPI->getXMLResponseObject();

Response Handling

Request Submission

Response Handling

Request Submission

Response Handling

Request Values

Element

Type

Max

Required

Notes

accountNum

Int(32)

 

Required

Assigned to each account by ProPay.

ccNum

String

19

Required

Standard cc numbers which must pass Luhn check.

expDate

String

4

Required

The expiration date in MMYY format.

CVV2

String

4

Required

The Card CVV2 Code. *Accepts both 3 and 4 character types.

cardholderName

String

25

Required

Name on card.

streetAddress

String

20

Required

Card holder’s address.

city

String

30

Required

Card holder’s address

state

String

2

Required

ISO standard 2 character US State code.

zipCode

String

9

Required

Valid-format US zip code 5 or 9 digits.

Response Values

Element

Type

Notes

status

string

Result of the transaction request. See ProPay Appendix for result code definitions

accountNum

integer

Echo of the account the API request was made for

How to call this method?

Example Request

Example Response

Implementation Details
Request Submission

Response Handling

Request Submission

Response Handling

Request Submission

Response Handling

Request Submission

Response Handling

Request Values
Response Values