问题
I have a scenario , where if the server is down , we need to do the "Refund" of currently made transaction entirely through the application. Is it possible ?
The following paypal Refund API requires Access token of oAuth from the merchant account , but i dont see any example if oAuth from merchant is possible on mobile end ? the sdk examples are doing this at server end mostly.
PaypalRefund
"PaypalHere SDK" allows this , but that API is different from regular Paypal API.
PaypalHereApi
回答1:
Finally i found a solution for paypal refund through app. It comprises of three very simple steps.
Get Access Token against merchant's Client id and secret.
Get Transaction details from the Payment Id
- Refund Payment using the sale id fetched in the second part.
Following is the working code for the above three steps.
Step1:
public class GetAccessToken extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
materialProgressBar.setVisibility(View.VISIBLE);
}
@Override
protected String doInBackground(String... strings) {
StringBuffer stringBuffer = new StringBuffer("");
try {
URL url = new URL("https://api.sandbox.paypal.com/v1/oauth2/token");
HttpsURLConnection httpsURLConnection = (HttpsURLConnection) url.openConnection();
httpsURLConnection.setRequestMethod("POST");
httpsURLConnection.addRequestProperty("Accept", "application/json");
httpsURLConnection.addRequestProperty("Accept-Language", "en_US");
httpsURLConnection.addRequestProperty("Content-Type", "application/x-www-form-urlencoded");
String basicAuth = "Basic " + base64;
httpsURLConnection.setRequestProperty("Authorization", basicAuth);
String data = "grant_type=client_credentials";
OutputStreamWriter outputWriter = new OutputStreamWriter(httpsURLConnection.getOutputStream());
outputWriter.write(data);
outputWriter.flush();
outputWriter.close();
Log.d(TAG, "Response Code; " + httpsURLConnection.getResponseCode());
InputStream is;
int status = httpsURLConnection.getResponseCode();
if (status >= 400)
is = httpsURLConnection.getErrorStream();
else
is = httpsURLConnection.getInputStream();
int read = -1;
byte[] buffer = new byte[512];
ByteArrayOutputStream baos = new ByteArrayOutputStream();
while ((read = is.read(buffer)) > 0) {
baos.write(buffer, 0, read);
baos.flush();
}
stringBuffer.append(new String(baos.toByteArray()));
} catch (Exception e) {
e.printStackTrace();
}
return stringBuffer.toString();
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
materialProgressBar.setVisibility(View.GONE);
onGettingAccessToken(s);
}
}
Step 2 :
public class GetTransactionDetail extends AsyncTask<String, Void, String> {
private static final String URL = " https://api.sandbox.paypal.com/v1/payments/payment/%s";
@Override
protected void onPreExecute() {
super.onPreExecute();
materialProgressBar.setVisibility(View.VISIBLE);
}
@Override
protected String doInBackground(String... strings) {
String address = String.format(URL, strings[0]);
StringBuffer stringBuffer = new StringBuffer("");
try {
URL url = new URL(address);
Log.d(TAG, address);
showLog(" Payment Id =" + strings[0] + " TOken = " + strings[1]);
HttpsURLConnection httpsURLConnection = (HttpsURLConnection) url.openConnection();
httpsURLConnection.setRequestMethod("GET");
httpsURLConnection.addRequestProperty("Content-Type", "application/json");
String basicAuth = "Bearer " + strings[1];
Log.d(TAG, basicAuth);
httpsURLConnection.setRequestProperty("Authorization", basicAuth);
Log.d(TAG, "Response Code; " + httpsURLConnection.getResponseCode());
Log.i(TAG, "************GETTING TRANSACTIN DETAILS ASYNC a********");
Log.i(TAG, "Payment ID =" + strings[0] + " Access Token = " + strings[1]);
InputStream is;
int status = httpsURLConnection.getResponseCode();
if (status >= 400)
is = httpsURLConnection.getErrorStream();
else
is = httpsURLConnection.getInputStream();
int read = -1;
byte[] buffer = new byte[512];
ByteArrayOutputStream baos = new ByteArrayOutputStream();
while ((read = is.read(buffer)) > 0) {
baos.write(buffer, 0, read);
baos.flush();
}
stringBuffer.append(new String(baos.toByteArray()));
showLog("Transaction Detail =" + stringBuffer.toString());
} catch (Exception e) {
e.printStackTrace();
showLog("Exception " + e.toString());
}
return stringBuffer.toString();
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
materialProgressBar.setVisibility(View.GONE);
// parse the json
onTransactionDetails(s);
}
}
Step 3:
public class RefundPayment extends AsyncTask<String, Void, String> {
private static final String URL = "https://api.sandbox.paypal.com/v1/payments/sale/%s/refund";
private static final String DATA = "{\"amount\":{\"total\": %s,\"currency\": \"%s\"}}";
@Override
protected void onPreExecute() {
super.onPreExecute();
materialProgressBar.setVisibility(View.VISIBLE);
showToastAlpha("Starting Payment Refund...");
/* progressDialog.setMessage("Please wait...");
progressDialog.show();*/
}
@Override
protected String doInBackground(String... strings) {
String address = String.format(URL, strings[0]);
String data;
if (strings[1] == null || strings[2] == null) {
data = "{}";
} else {
data = String.format(DATA, strings[1], strings[2]);
}
StringBuffer stringBuffer = new StringBuffer("");
try {
java.net.URL url = new URL(address);
Log.d(TAG, address);
HttpsURLConnection httpsURLConnection = (HttpsURLConnection) url.openConnection();
httpsURLConnection.setRequestMethod("POST");
httpsURLConnection.addRequestProperty("Accept", "application/json");
httpsURLConnection.addRequestProperty("Accept-Language", "en_US");
httpsURLConnection.addRequestProperty("Content-Type", "application/json");
String basicAuth = "Bearer " + strings[3];
Log.d(TAG, basicAuth);
httpsURLConnection.setRequestProperty("Authorization", basicAuth);
Log.i(TAG, "************GETTING REFUND PAYMENT a********");
Log.i(TAG, "SAle id =" + strings[0] + " Amount to Refund = " + strings[1] + " Currency =" + strings[2] + " Access token = " + strings[3]);
OutputStreamWriter outputWriter = new OutputStreamWriter(httpsURLConnection.getOutputStream());
Log.d(TAG, "Sending: " + data);
outputWriter.write(data);
outputWriter.flush();
outputWriter.close();
Log.d(TAG, "Response Code; " + httpsURLConnection.getResponseCode());
InputStream is;
int status = httpsURLConnection.getResponseCode();
if (status >= 400)
is = httpsURLConnection.getErrorStream();
else
is = httpsURLConnection.getInputStream();
int read = -1;
byte[] buffer = new byte[512];
ByteArrayOutputStream baos = new ByteArrayOutputStream();
while ((read = is.read(buffer)) > 0) {
baos.write(buffer, 0, read);
baos.flush();
}
stringBuffer.append(new String(baos.toByteArray()));
} catch (Exception e) {
e.printStackTrace();
}
return stringBuffer.toString();
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
materialProgressBar.setVisibility(View.GONE);
onRefundPayment(s);
}
}
来源:https://stackoverflow.com/questions/37144075/android-paypal-refund-through-app