Android在线支付
来源:互联网 发布:怎么用淘宝返利赚钱 编辑:程序博客网 时间:2024/05/04 21:12
今天照着教程做了一遍。毕竟不是高级工程师,有些东西只是停留在照葫芦画瓢。通过这一次和前几天的网络编程,知道了大体的流程。
现在会的大概就这两样:
一。能够跟着网上给的API,结合教程,七七八八把代码敲出来(暂时不能仅照着API完全独立把代码敲出来)。
二。同时由于软件环境的不同,报的错千奇百怪,但能有效地解决。
好了,废话不多说了。
1.下载Ping++SDK
网址https://www.pingxx.com/dlsdk。当然要先注册。
Server端选择Java,Client端选择Android
2.Server端
新建Dynamic Web Project(PingXX)
新建servlet。配置如下:
PayServlet.java
package com.example.PayServlet;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.annotation.WebServlet;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;/** * Servlet implementation class PayServlet */@WebServlet("/PayServlet")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"); // apiKey在ping++主页的账户和设置里面有 Pingpp.apiKey = "sk_test_yzvDa99GqTeLanvvbDOy9qrT"; // 获取客户端参数 ServletInputStream in = request.getInputStream(); byte[] bytes = new byte[512]; int len = -1; StringBuffer sb = new StringBuffer(); while ((len = in.read(bytes)) != -1) { sb.append(new String(bytes, 0, len)); } Gson gson = new Gson(); PaymentRequest pay = gson.fromJson(sb.toString(), PaymentRequest.class); // 获得 charge 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", "1234567890");//每次测试都要修改这里的order_no chargeMap.put("channel", pay.channel); chargeMap.put("client_ip", request.getRemoteAddr()); Map<String, String> app = new HashMap<String, String>(); app.put("id", "app_qTenzP0CO4CGirvL");// 应用ID chargeMap.put("app", app); try { // 发起交易请求 Charge charge = Charge.create(chargeMap); // 向客户端发送消息 PrintWriter pw = response.getWriter(); pw.write(charge.toString()); } catch (PingppException e) { e.printStackTrace(); } } //这个class要放在这个Java文件里,不然会报错classNotDefException。原因不明 //调试了好久 class PaymentRequest { String channel;// 支付渠道 int amount;// 价钱 public PaymentRequest(String channel, int amount) { this.channel = channel; this.amount = amount; } }}
服务器端参考下载下来的pingpp-java-master里面的example。依赖包里面也有(我上传的代码中WEB-INF里面还有index.jsp,是用来测试Server端是否成功用的)
3.Client端
新建Android工程Ping
MainActivity.java
package com.example.ping;import java.io.IOException;import android.app.Activity;import android.app.AlertDialog.Builder;import android.content.Intent;import android.os.AsyncTask;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import com.google.gson.Gson;import com.pingplusplus.android.PaymentActivity;import com.squareup.okhttp.MediaType;import com.squareup.okhttp.OkHttpClient;import com.squareup.okhttp.Request;import com.squareup.okhttp.RequestBody;import com.squareup.okhttp.Response;public class MainActivity extends Activity implements OnClickListener { // 银联支付渠道 private static final String CHANNEL_UPACP = "upacp"; private static final int REQUEST_CODE_PAYMENT = 1; private Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); button = (Button) findViewById(R.id.pay); button.setOnClickListener(this); } private String URL = "http://10.107.56.64:8080/PingXX/PayServlet"; class PaymentTask extends AsyncTask<PaymentRequest, Void, String> { @Override protected void onPreExecute() { // 按键点击之后的禁用,防止重复点击 button.setOnClickListener(null); } @Override protected String doInBackground(PaymentRequest... params) { PaymentRequest paymentRequest = params[0]; String data = null; String json = new Gson().toJson(paymentRequest); try { // 向Your Ping++ Server SDK请求数据 // URL服务器地址 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); Intent intent = new Intent(MainActivity.this, PaymentActivity.class); intent.putExtra(PaymentActivity.EXTRA_CHARGE, data); startActivityForResult(intent, REQUEST_CODE_PAYMENT); } } private static String postJson(String url, String json) throws IOException { MediaType type = MediaType.parse("application/json; charset=utf-8"); RequestBody body = RequestBody.create(type, json); // 封装请求对象 Request request = new Request.Builder().url(url).post(body).build(); OkHttpClient client = new OkHttpClient(); // 执行请求 Response response = client.newCall(request).execute(); // 返回请求结果 return response.body().string(); } /** * onActivityResult 获得支付结果,如果支付成功, * 服务器会收到ping++ 服务器发送的异步通知。 最终支付成功根据异步通知为准 */ protected void onActivityResult(int requestCode, int resultCode, Intent data) { button.setOnClickListener(this); // 支付页面返回处理 if (requestCode == 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; } Builder builder = new 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; } } @Override public void onClick(View v) { if (v.getId() == R.id.pay) { new PaymentTask().execute(new PaymentRequest(CHANNEL_UPACP, 100)); } }}
客户端端参考下载下来的pingpp-android-master里面的example。
测试结果
界面
准备进入支付页面
进入支付页面
付款成功:
代码链接http://download.csdn.net/detail/lxj1137800599/9488682
0 0
- Android在线支付
- android - 银联在线支付
- 在线支付
- 在线支付
- 在线支付
- 在线支付
- 在线支付
- 在线支付
- 在线支付
- 支付宝在线支付
- 黎活明-3G手机Android应用开发教程含在线支付
- 第三方支付,在线支付
- 支付宝在线支付接口
- 【在线支付】在线支付的方式
- 【在线支付】在线支付流程分析
- 【在线支付】在线支付代码详解
- 关于Android在线支付Alipay(支付宝)开发的经验分享
- 关于Android在线支付Alipay(支付宝)开发的经验分享
- PHP函数的实现原理及性能分析[2010年前文章]
- Activity生命周期
- DFS
- Cocos2dx 3.x 新建项目编译很慢的解决方案
- 链式队列
- Android在线支付
- 51nod 1686 第K大区间 (二分+滑动窗口+离散化)
- 消除 activity 启动时白屏、黑屏问题
- 表篇分区
- Android textAppearance的属性设置及TextView属性详解
- c++上机作业
- 深入理解和探究Java类加载机制
- 不同机型下label字体的大小
- 循环队列队空与队满两个状态的判断算法分析