安卓学习日记——在线支付
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,所以有些代码还是要根据实际情况修改的。
安卓学习日记——在线支付相关推荐
- 安卓学习日记:初识Android Studio · java环境配置和AS安装
工欲善其事,必先利其器.要进行安卓开发,必须要有一款上手的开发利器.查阅了相关资料后,了解到,现在主流的安卓开发工具是: 1. Eclipse + Android SDK 2. Android Stu ...
- 安卓学习日记——画布与绘制
先提一下Draw 9-patch 老版本的Android Studio是在SDK目录下的Tools里有个draw9patch 新版Android Studio是可以在AS里直接创建的(一开始没在目录下 ...
- 安卓学习笔记---支付宝支付-交易订单处理失败,请稍后再试。(提示ALI59错误)
当你第一次辛辛苦苦的集成支付宝,点击"立即支付"看到成功跳转到支付宝了,心里是不是有点小激动. 但是却出现一行大字:"交易订单处理失败,请稍后再试.(ALI59)&quo ...
- 安卓学习日记——Shortcut
Shortcuts初体验 好了, 在我们开始撸码之前, 还是来看看这个新特性有多赞, 新系统中好多google家的APP都集成了这项功能, 所以, 我们先挑个APP来体验一下. 长按会发现有个快捷打开 ...
- 安卓学习日记(一):了解安卓架构(linux内核层、系统运行库层、应用框架层、应用层)
首先为了理解安卓系统是怎么工作的,就先来看一下android的系统架构,其架构大至可以分为四层:linux内核层.系统运行库层.应用框架层和应用层,那就先说说这几层. 1.linux内核层: Andr ...
- 安卓学习日记——Vitamio框架
Vitamio中文名称"维他蜜",是一款Android与IOS平台上的全能多媒体开发框架,全面支持硬件解码与GPU渲染.Vitamio能够流程播放720P甚至1080P高清MKV, ...
- 安卓学习日记——广告
万普积分墙 去万普官网,注册账号,登录(www.waps.cn) 下载SKD,导包 添加权限 <uses-permission android:name="android.permis ...
- 安卓学习日记——媒体播放
简介 Android的多媒体框架包括支持播放多种常见的媒体类型,使您可以轻松地把音频.视频和图像集成到你的应用.你可以播放音频或视频媒体文件,这些文件是存储在你的应用程序的资源文件中的.应用程序的资源 ...
- 安卓学习日记——APP共享内容
分享简单的文本内容 public void sharedSimpleContentClick(View v){Intent intent=new Intent();intent.setAction(I ...
最新文章
- LeetCode简单题之递增顺序搜索树
- CLion报错解决:allocating an object of abstract class type--unimplemented pure virtual method
- 如何修改路由器和交换机的密码
- 【论文解读】Confluence:物体检测中不依赖IoU的NMS替代算法论文解析
- GitLab CI持续集成配置方案
- [团队开发]总结下Server 2008 + TeamFoundation Server 2008安装过程
- 静态属性,函数闭包,call/apply,继承
- spring tiles_Spring MVC 3模板和Apache Tiles
- oom 如何避免 高并发_如何设计这样一个高并发系统?
- 11g DG中的参数
- 若依mybatis返回map将下划线命名转为驼峰式命名
- 简述导线平差计算的五个步骤_闭合导线平差计算步骤
- JDY-24M 超级 BLE 蓝牙模块——理解与实践
- 我手机中的舍不得删除的48条笑话,条条经典!! (转自猫扑)
- 文华软件登录显示请选择服务器,文华随身行 请先登入云服务器
- Vue 脚手架搭建目录及文件详解
- Urp下自定义特效管线和后处理特效实现
- 广东中山电信DNS地址 (铁通/网通)
- win10 pro 使用远程桌面
- MTK 电池曲线配置【转】