Pingxx
官网:https://www.pingxx.com/
服务器端和客户端的配置参考官方的文档
客户端代码
package com.example.pingxx;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.os.AsyncTask;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import com.google.gson.Gson;
import com.pingplusplus.android.PaymentActivity;
import com.pingplusplus.android.Pingpp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button button_pay;
private static final int REQUEST_CODE_PAYMENT = 1;
/**
* 银联支付渠道
*/
private static final String CHANNEL_UPACP = "upacp";
/**
* 微信支付渠道
*/
private static final String CHANNEL_WECHAT = "wx";
/**
* QQ钱包支付渠道
*/
private static final String CHANNEL_QPAY = "qpay";
/**
* 支付宝支付渠道
*/
private static final String CHANNEL_ALIPAY = "alipay";
/**
* 百度支付渠道
*/
private static final String CHANNEL_BFB = "bfb_wap";
/**
* 京东支付渠道
*/
private static final String CHANNEL_JDPAY_WAP = "jdpay_wap";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button_pay=findViewById(R.id.button_pay);
button_pay.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.button_pay:
new PaymentTask().execute(new PaymentRequest(CHANNEL_UPACP, 100));//数字按分来算,100=一块
break;
}
}
private static final String URL="http://192.168.1.82:8080/Pingxx/PayServlet";
//异步支付任务
class PaymentTask extends AsyncTask<PaymentRequest,Void,String>{
@Override
protected void onPreExecute() {
//按键点击之后的禁用,防止重复点击
//防止重复提交
button_pay.setOnClickListener(null);
}
@Override
protected String doInBackground(PaymentRequest... paymentRequests) {
PaymentRequest paymentRequest = paymentRequests[0];
String data = null;
String json=new Gson().toJson(paymentRequest);
try {
//向Your Ping++ Server SDK请求数据
data = postJson(URL, json);
} catch (Exception e) {
e.printStackTrace();
}
return data;
}
/**
* 获得服务端的charge,调用ping++ sdk。
*/
@Override
protected void onPostExecute(String data) {
if(null == data){
showMsg("请求出错", "请检查URL", "URL无法获取charge");
return;
}
Log.d("charge", data);
//除QQ钱包外,其他渠道调起支付方式:
//参数一:Activity 当前调起支付的Activity
//参数二:data 获取到的charge或order的JSON字符串
// Pingpp.createPayment(ClientSDKActivity.this, data);
Intent intent=new Intent();
String packageName=getPackageName();
ComponentName componentName=new ComponentName(packageName,packageName+".wxapi.WXPayEntryActivity");
intent.setComponent(componentName);
intent.putExtra(PaymentActivity.EXTRA_CHARGE,data);
startActivityForResult(intent,REQUEST_CODE_PAYMENT);
//QQ钱包调用方式
//参数一:Activity 当前调起支付的Activity
//参数二:data 获取到的charge或order的JSON字符串
//参数三:“qwalletXXXXXXX”需与AndroidManifest.xml中的scheme值一致
//Pingpp.createPayment(ClientSDKActivity.this, data, "qwalletXXXXXXX");
}
}
//请求服务器
private static String postJson(String urlStr, String json) throws IOException {
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(8000);
conn.setReadTimeout(8000);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type","application/json");
conn.setDoOutput(true);
conn.setDoInput(true);
conn.getOutputStream().write(json.getBytes());
if(conn.getResponseCode() == 200) {
BufferedReader
reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
return response.toString();
}
return null;
}
/**
* onActivityResult 获得支付结果,如果支付成功,服务器会收到ping++ 服务器发送的异步通知。
* 最终支付成功根据异步通知为准
*/
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
button_pay.setOnClickListener(this);
//支付页面返回处理
if (requestCode == Pingpp.REQUEST_CODE_PAYMENT) {
if (resultCode == Activity.RESULT_OK) {
String result = data.getExtras().getString("pay_result");
/* 处理返回值
* "success" - payment succeed
* "fail" - payment failed
* "cancel" - user canceld
* "invalid" - payment plugin not installed
*/
String errorMsg = data.getExtras().getString("error_msg"); // 错误信息
String extraMsg = data.getExtras().getString("extra_msg"); // 错误信息
showMsg(result, errorMsg, extraMsg);
}
}
}
public void showMsg(String title, String msg1, String msg2) {
String str = title;
if (null !=msg1 && msg1.length() != 0) {
str += "\n" + msg1;
}
if (null !=msg2 && msg2.length() != 0) {
str += "\n" + msg2;
}
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setMessage(str);
builder.setTitle("提示");
builder.setPositiveButton("OK", null);
builder.create().show();
}
class PaymentRequest {
String channel;//支付渠道
int amount;//价格
public PaymentRequest(String channel, int amount) {
this.channel = channel;
this.amount = amount;
}
}
}
服务器端代码
package com.example.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.google.gson.Gson;
import com.pingplusplus.Pingpp;
import com.pingplusplus.exception.PingppException;
import com.pingplusplus.model.Charge;
public class PayServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public PayServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("application/json;charset=UTF-8");
PrintWriter out=response.getWriter();
Pingpp.apiKey="Your-Key";
//获取客户端参数:amount,channel
ServletInputStream in= request.getInputStream();
byte[] bytes=new byte[512];
int len=-1;
StringBuffer buf=new StringBuffer();
while((len=in.read(bytes))!=-1){
buf.append(new String(bytes,0,len));
}
Gson gson=new Gson();
PaymentRequest pay= gson.fromJson(buf.toString(), PaymentRequest.class);
Map<String, Object> chargeMap = new HashMap<String, Object>();
// 某些渠道需要添加extra参数,具体参数详见接口文档
chargeMap.put("amount", pay.amount);
chargeMap.put("currency", "cny");
chargeMap.put("subject", "购买了一款时髦的短发");
chargeMap.put("body", "黑色,短款,齐刘海");
chargeMap.put("order_no", "123456789");
chargeMap.put("channel", pay.channel);
chargeMap.put("client_ip", request.getRemoteAddr());
Map<String, String> app = new HashMap<String, String>();
app.put("id", "YOUR_APP_ID");
chargeMap.put("app", app);
try {
//发起交易请求
Charge charge = Charge.create(chargeMap);
System.out.println(charge.toString());
out.write(charge.toString());
} catch (PingppException e) {
e.printStackTrace();
}
}
}
package com.example.servlet;
public class PaymentRequest {
String channel;//支付渠道
int amount;//价格
public PaymentRequest(String channel, int amount) {
this.channel = channel;
this.amount = amount;
}
}
成功效果是这样的,但是由于我还没有工作,所以注册那边的身份验证没做,得不到APPKey,所以有些代码还是要根据实际情况修改的。