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";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button_pay=findViewById(R.id.button_pay);button_pay.setOnClickListener(this);}@Overridepublic 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>{@Overrideprotected void onPreExecute() {//按键点击之后的禁用,防止重复点击//防止重复提交button_pay.setOnClickListener(null);}@Overrideprotected 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。*/@Overrideprotected 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) {BufferedReaderreader = 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,channelServletInputStream 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,所以有些代码还是要根据实际情况修改的。

安卓学习日记——在线支付相关推荐

  1. 安卓学习日记:初识Android Studio · java环境配置和AS安装

    工欲善其事,必先利其器.要进行安卓开发,必须要有一款上手的开发利器.查阅了相关资料后,了解到,现在主流的安卓开发工具是: 1. Eclipse + Android SDK 2. Android Stu ...

  2. 安卓学习日记——画布与绘制

    先提一下Draw 9-patch 老版本的Android Studio是在SDK目录下的Tools里有个draw9patch 新版Android Studio是可以在AS里直接创建的(一开始没在目录下 ...

  3. 安卓学习笔记---支付宝支付-交易订单处理失败,请稍后再试。(提示ALI59错误)

    当你第一次辛辛苦苦的集成支付宝,点击"立即支付"看到成功跳转到支付宝了,心里是不是有点小激动. 但是却出现一行大字:"交易订单处理失败,请稍后再试.(ALI59)&quo ...

  4. 安卓学习日记——Shortcut

    Shortcuts初体验 好了, 在我们开始撸码之前, 还是来看看这个新特性有多赞, 新系统中好多google家的APP都集成了这项功能, 所以, 我们先挑个APP来体验一下. 长按会发现有个快捷打开 ...

  5. 安卓学习日记(一):了解安卓架构(linux内核层、系统运行库层、应用框架层、应用层)

    首先为了理解安卓系统是怎么工作的,就先来看一下android的系统架构,其架构大至可以分为四层:linux内核层.系统运行库层.应用框架层和应用层,那就先说说这几层. 1.linux内核层: Andr ...

  6. 安卓学习日记——Vitamio框架

    Vitamio中文名称"维他蜜",是一款Android与IOS平台上的全能多媒体开发框架,全面支持硬件解码与GPU渲染.Vitamio能够流程播放720P甚至1080P高清MKV, ...

  7. 安卓学习日记——广告

    万普积分墙 去万普官网,注册账号,登录(www.waps.cn) 下载SKD,导包 添加权限 <uses-permission android:name="android.permis ...

  8. 安卓学习日记——媒体播放

    简介 Android的多媒体框架包括支持播放多种常见的媒体类型,使您可以轻松地把音频.视频和图像集成到你的应用.你可以播放音频或视频媒体文件,这些文件是存储在你的应用程序的资源文件中的.应用程序的资源 ...

  9. 安卓学习日记——APP共享内容

    分享简单的文本内容 public void sharedSimpleContentClick(View v){Intent intent=new Intent();intent.setAction(I ...

最新文章

  1. LeetCode简单题之递增顺序搜索树
  2. CLion报错解决:allocating an object of abstract class type--unimplemented pure virtual method
  3. 如何修改路由器和交换机的密码
  4. 【论文解读】Confluence:物体检测中不依赖IoU的NMS替代算法论文解析
  5. GitLab CI持续集成配置方案
  6. [团队开发]总结下Server 2008 + TeamFoundation Server 2008安装过程
  7. 静态属性,函数闭包,call/apply,继承
  8. spring tiles_Spring MVC 3模板和Apache Tiles
  9. oom 如何避免 高并发_如何设计这样一个高并发系统?
  10. 11g DG中的参数
  11. 若依mybatis返回map将下划线命名转为驼峰式命名
  12. 简述导线平差计算的五个步骤_闭合导线平差计算步骤
  13. JDY-24M 超级 BLE 蓝牙模块——理解与实践
  14. 我手机中的舍不得删除的48条笑话,条条经典!! (转自猫扑)
  15. 文华软件登录显示请选择服务器,文华随身行 请先登入云服务器
  16. Vue 脚手架搭建目录及文件详解
  17. Urp下自定义特效管线和后处理特效实现
  18. 广东中山电信DNS地址 (铁通/网通)
  19. win10 pro 使用远程桌面
  20. MTK 电池曲线配置【转】

热门文章

  1. CISP笔记 Cyrus
  2. nyoj892买牛奶
  3. 摄影毁一生单反穷三代顺口溜_在美院读摄影专业是什么体验?不是累成狗也不是毁一生。...
  4. 波士顿动力机器人大秀男团舞
  5. Til the Cows Come Home
  6. 快速搭建koa2手脚架指南
  7. 我多想时光都可以典当,你回来带我赎回过往
  8. python asyncio_Python 异步 IO系列:认识asyncio
  9. Linux下execl函数与execlp函数的具体详细用法
  10. android锁屏快捷键设置,【Android高级】锁屏功能简单实现