我有一个场景,如果服务器关闭,我们需要对当前进行的事务Popen()
进行“退款”。可能吗 ?
以下paypal Refund API需要来自商家帐户的oAuth访问令牌,但我没有看到任何例子,如果商家的oAuth可能在移动端? sdk示例主要是在服务器端执行此操作。
PaypalRefund
“PaypalHere SDK”允许这样做,但该API与常规API不同 Paypal API。
答案 0 :(得分:0)
最后,我通过应用找到了 paypal退款的解决方案。 它包含三个非常简单的步骤。
针对商家的客户ID和密码获取访问令牌。
从付款ID
以下是上述三个步骤的工作代码。
<强>步骤1:强>
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);
}
}
第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);
}
}
第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);
}
}