Android-移动支付

支付宝

流程:

  1. 得到后台返回得sign值
  2. 调用SDK支付
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    /**
    * 调用SDK支付
    */
    public void alipay(final String url) {
    // app支付请求参数字符串,主要包含商户的订单信息,key=value形式,以&连接。
    String orderInfo = getOrderInfo("付款详情", "支付宝支付", shoulePay);
    // 完整的符合支付宝参数规范的订单信息。来源必须是服务器。
    final String payInfo = orderInfo + "&sign=\"" + url + "\"&" + getSignType();
    Log.e("alipay",payInfo);
    // 需要在新线程中调用支付接口
    Runnable payRunnable = new Runnable() {
    @Override
    public void run() {
    // PayTask 对象主要为商户提供订单支付、查询功能,及获取当前开发包版本号。
    // 获取 PayTask 支付对象调用支付(支付行为需要在独立的非ui线程中执行),代码示例:
    PayTask alipay = new PayTask(PayDemoActivity.this);
    // 调用支付接口,获取支付结果。true->支付时唤起一个loading。
    String result = alipay.pay(payInfo, true);
    //resultStatus={4000};memo={系统繁忙,请稍后再试};result={}
    Message msg = new Message();
    msg.what = BuildConstanst.SDK_PAY_FLAG;
    msg.obj = result;
    mHandler.sendMessage(msg);
    }
    };
    // 必须异步调用
    Thread payThread = new Thread(payRunnable);
    payThread.start();
    }

    @SuppressLint("HandlerLeak")
    private Handler mHandler = new Handler() {
    @SuppressWarnings("unused")
    public void handleMessage(Message msg) {
    switch (msg.what) {
    case BuildConstanst.SDK_PAY_FLAG: {
    PayResult payResult = new PayResult((String) msg.obj);
    /**
    * 同步返回的结果必须放置到服务端进行验证(验证的规则请看https://doc.open.alipay.com/doc2/
    * detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&
    * docType=1) 建议商户依赖异步通知
    */
    String resultInfo = payResult.getResult();// 同步返回需要验证的信息

    String resultStatus = payResult.getResultStatus();
    // 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档
    if (TextUtils.equals(resultStatus, "9000")) {
    //支付成功调用后台修改订单状态
    alipayChangeOrderStatus();
    } else {
    // 判断resultStatus 为非"9000"则代表可能支付失败
    // "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)
    if (TextUtils.equals(resultStatus, "8000")) {
    Toast.makeText(PayDemoActivity.this, "支付结果确认中", Toast.LENGTH_SHORT).show();
    } else {
    // 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误
    Toast.makeText(PayDemoActivity.this, "支付失败", Toast.LENGTH_SHORT).show();
    }
    }
    break;
    }
    default:
    break;
    }
    }
    };
  3. 支付成功后更改后台订单状态

微信

流程;

  1. 生成签名参数
  2. 调起微信支付;
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    /**
    * 微信支付
    */
    private void sendPayReq() {
    PayReq request = new PayReq();
    request.appId = BuildConstanst.APP_ID;
    // 商户号
    request.partnerId = BuildConstanst.MCH_ID;
    // 微信预支付订单ID
    request.prepayId = payvo.prepayId;
    // package 微信固定参数
    request.packageValue = payvo.packageValue;
    // 随机32位字符串
    request.nonceStr = payvo.nonceStr;
    // 时间戳
    request.timeStamp = payvo.timeStamp;
    // sign签名校验码
    request.sign = payvo.sign;
    msgApi.sendReq(request);
    }
  3. 支付验证查询
    WXPayEntryActivity.java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64

    //回调这个函数
    @Override
    public void onResp(BaseResp resp) {
    // TODO Auto-generated method stub
    if(resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX){
    switch (resp.errCode) {
    case 0:
    //成功
    check();
    break;
    case -1:
    //失败"
    Toast.makeText(WXPayEntryActivity.this, "失败了", Toast.LENGTH_SHORT).show();
    WXPayEntryActivity.this.finish();
    break;
    case -2:
    //取消
    Toast.makeText(WXPayEntryActivity.this, "取消", Toast.LENGTH_SHORT).show();
    WXPayEntryActivity.this.finish();
    break;
    default:
    break;
    }
    }
    }

    /**
    * 支付验证查询
    */
    private void check(){
    OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。
    FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体
    formBody.add("id", id);//传递键值对参数
    Request request = new Request.Builder()//创建Request 对象。
    .url("")
    .post(formBody.build())//传递请求体
    .build();
    client.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
    WXPayEntryActivity.this.finish();
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
    Type listType = new TypeToken<PayBean>() {
    }.getType();
    Gson gson = new Gson();
    payvo = gson.fromJson(response.body().string(), listType);
    if(payvo != null){
    if(payvo.return_code.equals("SUCCESS")){
    Toast.makeText(WXPayEntryActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
    //后台验证成功后关掉支付页面

    }else{
    //后台验证失败
    }
    }
    //关闭当前页面
    WXPayEntryActivity.this.finish();
    }
    });
    }