微信支付(一)

从统一下单 到生成支付订单 然后调用支付的全部过程


    private void payByWechat() {
    UserNets.getInstance().getSignOrderInfo(orderId,0, new Subscriber<BaseResponse<String>>() {
      @Override public void onCompleted() {

      }

      @Override public void onError(Throwable e) {

      }

      @Override public void onNext(BaseResponse<String> stringBaseResponse) {
        String payXxx = stringBaseResponse.getData();
        System.out.println(payXxx);
        RxBus.getDefault().postSticky(confirmOrder);
        RxBus.getDefault().postSticky(new WxSendFlag(WxPayFlag.OrderConfirm));
        isSava = true;
        iwxapi = WXAPIFactory.createWXAPI(getActivity(), Defaultcontent.APP_ID);
        iwxapi.registerApp(Defaultcontent.APP_ID);
        final JSONObject result =JSON.parseObject(payXxx);
        final String prepayId = result.getString("prepay_id");
        final String partnerId = result.getString("mch_id");
        final String packageValue = result.getString("package_");
        final String timestamp = result.getString("timestamp");
        final String nonceStr = result.getString("nonce_str");
        final String paySign = result.getString("sign");

        final PayReq payReq = new PayReq();
        payReq.appId = Defaultcontent.APP_ID;
        payReq.prepayId = prepayId;
        payReq.partnerId = partnerId;
        payReq.packageValue = packageValue;
        payReq.timeStamp = timestamp;
        payReq.nonceStr = nonceStr;
        payReq.sign = paySign;
        iwxapi.sendReq(payReq);
      }
    });
  }
  • 关于签名sign的问题
    这是第一次签名 需要把之前所配置的所有参数(除了sign属性)形成一个统一的字符串按照https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=4_3这里的算法生成。(这里面有个ASCII码从小到大排序{因为数据不多,不会写算法就直接自己计算,就是把参数的名称的第一个字母按照(abcd……)的循序排列,如果第一个字母相同,就比较第一个字母相同的名称里面的第二个字母})由此排序生成的字符串与key(其值是API密匙)一起经过MD5加密(这里必须用UTF-8格式的加密字符串)

    这个sign算好之后 通过post方式发送微信接口https://api.mch.weixin.qq.com/pay/unifiedorder,应该会返回一个XML格式数据 解析之后会获得许多数据,甚至有sign,但是这些全部都不需要,只需要prepayid这个属性就行了,但我通过测试几次发现返回的数据中,除了sign不能用之外,其他的都能用

  • 再次向微信发送数据
    如上面代码中:

  • 这次是调用支付所需要的参数,这些参数在https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_12&index=2里面,都是必须填的,之前获得了prepayid,然后新属性package是固定值,其他的值(除了sign之外)可以在第一步所需要的参数获取到。
    这里最重要的是生成sign属性了,它的生成与第一步的方法差不多,只是参数是调用支付API上面的参数。还是要注意ASCII码从小到大排序(最好手动配置)。到这里
    如果你是后台,你就把这些数据形成JSON数据发给手机端。如果是APP直接获取,那么可用 PayReq req = new
    PayReq();

    给 req.appId=申请的APPiD;
    req.partnerId=商户号;
    req.prepayId=第一次返回的prepayid;
    req.nonceStr=32位随机数;
    req.timeStamp=时间截;
    req.packageValue=”Sign=WXPay”;固定值

    req.sign=sign1(这个值要么是后台获得,要么是第二次生成的签名);
    req.extData= “app data”;这一句不知道有什么用,但是不调用会导致-1;

    最后一步

    APP里要调用 api.sendReq(req);(如果之前有分享,要确定分享包里面有支付功能不然不能调出微信支付界面)

  • WXPayEntryActivity中的实现

public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
  private IWXAPI api;
  private int sendFlag;

  @Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.pay_result);

    api = WXAPIFactory.createWXAPI(this, Defaultcontent.APP_ID);
    api.handleIntent(getIntent(), this);

    RxBus.getDefault().toObservableSticky(WxSendFlag.class).subscribe(new Action1<WxSendFlag>() {
      @Override public void call(WxSendFlag wxSendFlag) {
        sendFlag = wxSendFlag.getSendFlag();
      }
    });
  }

  @Override protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
    api.handleIntent(intent, this);

  }

  @Override public void onReq(BaseReq req) {
  }

  @Override public void onResp(BaseResp baseResp) {
    if (baseResp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {

      switch (baseResp.errCode) {
        case WxPayFlag.WX_PAY_SUCCESS:
          onPaySuccess();
          break;
        case WxPayFlag.WX_PAY_FAIL:
          onPayFail();
          break;
        case WxPayFlag.WX_PAY_CANCEL:
          onPayCancel();
          break;
        default:
          break;
      }
    }

  }

  private void onPayCancel() {
    Toast.makeText(this, "支付取消", Toast.LENGTH_SHORT).show();
    finish();
    overridePendingTransition(0, 0);
    RxBus.getDefault().postSticky(new WxReceiveFlag(sendFlag,WxPayFlag.WX_PAY_CANCEL));
  }

  private void onPayFail() {
    Toast.makeText(this, "支付失败", Toast.LENGTH_SHORT).show();
    finish();
    overridePendingTransition(0, 0);
    RxBus.getDefault().postSticky(new WxReceiveFlag(sendFlag,WxPayFlag.WX_PAY_FAIL));
  }

  private void onPaySuccess() {
    Toast.makeText(this, "支付成功", Toast.LENGTH_SHORT).show();
    finish();
    overridePendingTransition(0, 0);
    RxBus.getDefault().postSticky(new WxReceiveFlag(sendFlag,WxPayFlag.WX_PAY_SUCCESS));
  }

  @Override protected void onDestroy() {
    super.onDestroy();
    //RxBus.getDefault().removeStickyEvent(WxSendFlag.class);
  }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值