安卓学习日记——在线支付

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,所以有些代码还是要根据实际情况修改的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值