2017-12-02 11:28:10 u013777094 阅读数 4678

作者简介

微信公众号(高质量文章推送):走向全栈工程师
作者:陈博易
声明:本文是个人原创,未经允许请勿转载
商业合作请在微信公众号回复:联系方式


支付宝支付


微信支付

前言


  1. 现在的多数App都离不开集成阿里支付宝支付和微信支付
  2. 准备写两篇关于阿里支付宝支付和微信支付的教程,让大家可以快速集成支付
  3. Android前端 Java后端 集成支付宝支付
  4. 微信支付是本篇的重点

环境以及工具


  1. Android项目:AndroidStudio3.0
  2. Java项目:IntelliJ IDEA 2017.2.3

整体步骤


  1. 微信支付申请流程
  2. Android端环境集成
  3. Android端代码展示
  4. Java后端代码展示

详细步骤


请参考微信支付开发文档
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1

核心步骤解读


1. 微信支付申请流程

https://pay.weixin.qq.com/guide/inapp_payment.shtml

商户在微信开放平台申请开发应用后,微信开放平台会生成APP的唯一标识APPID。由于需要保证支付安全,需要在开放平台绑定商户应用包名和应用签名,设置好后才能正常发起支付。

2. Android端环境集成

将微信提供给我们的,wxapi的文件放到我们的主包下面(重要的事情说三次)

3. Android端代码展示
  1. 前端app支付回调核心代码

  1. 前端app支付核心代码

4. Java后端代码展示

微信商户的基本参数

这是java后端做的事情,大概看看就好,我们前端就发起支付就好

App支付成功以后,java后端会收到异步回调,也就是对数据库进行操作

image.png

/**
 * Create by: 陈博易
 * Date: 2017/12/1
 * time:  16:01
 * Email: 495057454@qq.com
 * 微信公众号:走向全栈工程师
 * <p>
 * 微信支付 支付宝支付辅助类
 */
public class PaymentHelper {
    private static final int SDK_PAY_FLAG = 1;

    /**
     * @param activity        调用的activity
     * @param weChatPayEntity 微信调用参数
     */
    public void startWeChatPay(Activity activity, WxChatPayEntity weChatPayEntity) {
        if (activity == null || weChatPayEntity == null) {
            return;
        }
        if (!WxPayConfig.APP_ID.equals(weChatPayEntity.getAppid())) {
            return;
        }
        IWXAPI wxapi = WXAPIFactory.createWXAPI(activity, WxPayConfig.APP_ID, true);
        // 将该app注册到微信
        wxapi.registerApp(WxPayConfig.APP_ID);
        PayReq req = new PayReq();
        req.appId = WxPayConfig.APP_ID;
        req.partnerId = weChatPayEntity.getPartnerid();
        req.prepayId = weChatPayEntity.getPrepayid();
        req.nonceStr = weChatPayEntity.getNoncestr();
        req.timeStamp = weChatPayEntity.getTimeStamp();
        req.packageValue = weChatPayEntity.getPackageValue();// "Sign=" +
        req.sign = weChatPayEntity.getSign();
        wxapi.sendReq(req);
    }

    /**
     * @param activity     调用的activity
     * @param alipayEntity 支付宝参数
     */
    public void startAliPay(final Activity activity, final AlipayEntity alipayEntity) {
        if (activity == null || alipayEntity == null) {
            return;
        }
        Runnable payRunnable = new Runnable() {

            @Override
            public void run() {
                // 构造PayTask 对象
                PayTask alipay = new PayTask(activity);
                // 调用支付接口,获取支付结果
                String result = alipay.pay(alipayEntity.getPayInfo(), true);

                Message msg = new Message();
                msg.what = 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 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")) {
                        Toast.makeText(MyApplication.getContext(), "支付成功", Toast.LENGTH_SHORT).show();
                    } else {
                        // 判断resultStatus 为非"9000"则代表可能支付失败
                        // "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)
                        if (TextUtils.equals(resultStatus, "8000")) {
                            Toast.makeText(MyApplication.getContext(), "支付结果确认中", Toast.LENGTH_SHORT).show();

                        } else if (TextUtils.equals(resultStatus, "6001")) {
                            Toast.makeText(MyApplication.getContext(), "用户取消支付", Toast.LENGTH_SHORT).show();
                        } else {
                            // 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误
                            Toast.makeText(MyApplication.getContext(), "支付失败", Toast.LENGTH_SHORT).show();

                        }
                    }
                    break;
                }
                default:
                    break;
            }
        }

    };


}

总结


  1. 微信开放平台提供的demo,有一些坑已经帮大家清除了,导入进去就可以支付了,就是代码不优雅
  2. 个人封装的demo(微信支付和支付宝支付案例都集成在一起了,直接复制黏贴)
  3. 请大家多关注关注我。

  4. 导入小编项目的姿势要对!

个人相关教程

各种大佬推荐的编程视频资源分享
Android前端 Java后端 集成支付宝支付
postman使用 Android java后端 接口调试工具
Android抓包 Charles http接口调试
消息推送 Android java后端集成小米推送
如何导入简单的java项目-IntelliJ IDEA

请关注我(高质量文章推送)

源码地址———关注微信公众号,回复:微信支付宝支付


ndk开源教程地址(入门到放弃篇)


长按二维码“识别”关注或者扫一扫

2018-11-19 15:37:48 broken5235 阅读数 95

今天记录下微信和支付宝支付,做一下分享,希望对大家有所帮助!

一、微信支付

1、在build.gradle文件中,添加如下依赖:

dependencies {
    compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
}



 

dependencies {
    compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
}

2、配置回调activity

<activity
    android:name=".wxapi.WXPayEntryActivity"
    android:exported="true"
    android:launchMode="singleTop"/>

3、调用支付

private IWXAPI api;
    public void WxPay(View view, final String resString) {//resString是根据orderId调用后台接口返还回的json字符串
        new Thread(new Runnable() {
            @Override
            public void run() {
                JSONObject jsonObject = null;
                try {
                    jsonObject = new JSONObject(resString);
                    JSONObject dataObject = jsonObject.getJSONObject("data");
                    String appid=dataObject.getString("appid");
                    String partnerid=dataObject.getString("partnerid");
                    String prepayid=dataObject.getString("prepayid");
                    String pay_response_package=dataObject.getString("package");
                    String noncestr=dataObject.getString("noncestr");
                    String timestamp=dataObject.getString("timestamp");
                    String sign=dataObject.getString("sign");
                    //Log.e("debug","微信支付"+resString);
                    //IWXAPI api = WXAPIFactory.createWXAPI(getApplicationContext(),appid,true);//实例化接口
                    api = WXAPIFactory.createWXAPI(getApplicationContext(),null);//实例化接口
                    api.registerApp(appid);    //将接口注册到微信
                    PayReq req = new PayReq();
                    req.appId = appid;
                    req.partnerId = partnerid;
                    req.prepayId = prepayid;
                    req.nonceStr = noncestr;
                    req.timeStamp = timestamp;
                    req.packageValue =pay_response_package;
                    req.sign = sign;
                    req.extData = "app data"; // optional
                    Log.e("debug","微信支付:"+appid+"\n"+partnerid+"\n"+prepayid+"\n"+pay_response_package+"\n"+noncestr+"\n"+timestamp+"\n"+sign);
                    api.sendReq(req);           // 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
                } catch (JSONException e) {
                    e.printStackTrace();
                    mytoast.show(getApplicationContext(),"error!");
                }
                finish();
            }
        }).start();
    }

4、备注:

按照微信的流程是需要客户端调用服务器的接口创建订单-->获取订单ID-->再调用服务器接口获取预支付订单(这个要注意,要根据微信的规范,服务器在调用统一下单接口后将微信返回给的参数进行再签名,然后通过接口返回给客户端,客户端再调用微信支付,否则,一般是sign的值的问题,如果没有进行再签名,客户端调用不起来微信支付。这一段是当时做微信支付时网络文章上一段文字,感觉不错就贴了下来,帮助理解,希望这个流程可以帮助到不懂的小伙伴们,实际开发中我们需要先调用服务器接口下单,然后通过这个订单id获取服务器返回微信支付相关参数的支付接口,然后调起微信支付就可以实现支付了。我们用微信支付当然还要在开发平台上申请支付。

5、支付回调类

public class WXPayEntryActivity extends AppCompatActivity  implements IWXAPIEventHandler {
    //注册到微信方法所用到的属性
    final public String App_ID = "自己申请的AppID";//
    private IWXAPI api;//IWXAPI是微信与第三方APP的开放接口
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_wxentry);
        api = WXAPIFactory.createWXAPI(this,App_ID,true);//实例化接口
        api.registerApp(App_ID);//将接口注册到微信
        api.handleIntent(getIntent(),this);
    }

    @Override
    public void onReq(BaseReq baseReq) {

    }

    @Override
    public void onResp(BaseResp baseResp) {
        String result = "";
        switch (baseResp.errCode) {
            case BaseResp.ErrCode.ERR_OK://0
                mytoast.show(this,"支付成功!");
                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL://-2
                mytoast.show(this,"取消支付!");
                break;
            case BaseResp.ErrCode.ERR_COMM://-1
                mytoast.show(this,"支付失败!");
                //mytoast.show(this,baseResp.errStr+"");
                break;
            default:
                break;
        }
        finish();
    }
}

二、支付宝支付

1、引入jar包

引入alipaySdk相关jar包,这个jar包我们可以在官方下载,也可以在网上下载一个,https://docs.open.alipay.com/54/104509/ 这里是官方的通道。

2、配置activity

<activity android:name="com.alipay.sdk.app.H5PayActivity" android:configChanges="orientation|keyboardHidden|navigation" android:exported="false" android:screenOrientation="behind"></activity>
<activity android:name="com.alipay.sdk.auth.AuthActivity" android:configChanges="orientation|keyboardHidden|navigation" android:exported="false" android:screenOrientation="behind"></activity>

3、权限声明:

<uses android:name="android.permission.INTERNET">
<uses android:name="android.permission.ACCESS_NETWORK_STATE">
<uses android:name="android.permission.ACCESS_WIFI_STATE">
<uses android:name="android.permission.READ_PHONE_STATE">
<uses android:name="android.permission.WRITE_EXTERNAL_STORAGE">

4、添加混淆规则


在商户应用工程的proguard-project.txt里添加以下相关规则:

-keep class com.alipay.android.app.IAlixPay{*;}
-keep class com.alipay.android.app.IAlixPay$Stub{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}
-keep class com.alipay.sdk.app.PayTask{ public *;}
-keep class com.alipay.sdk.app.AuthTask{ public *;}
-keep class com.alipay.sdk.app.H5PayCallback {
    <fields>;
    <methods>;
}
-keep class com.alipay.android.phone.mrpc.core.** { *; }
-keep class com.alipay.apmobilesecuritysdk.** { *; }
-keep class com.alipay.mobile.framework.service.annotation.** { *; }
-keep class com.alipay.mobilesecuritysdk.face.** { *; }
-keep class com.alipay.tscenter.biz.rpc.** { *; }
-keep class org.json.alipay.** { *; }
-keep class com.alipay.tscenter.** { *; }
-keep class com.ta.utdid2.** { *;}
-keep class com.ut.device.** { *;}

4、调用支付

public void onClick(View view) {//支付按钮
        Runnable payRunnable = new Runnable() {//调用,起一个线程
            @Override
            public void run() {
                // 调起支付界面
                PayTask alipay = new PayTask(PaymentMethod.this);
                Map<String,String> result = alipay.payV2(aliPayOrderInfo, true);//根据接口创建订单获取orderID,通过orderID拉订单数据,aliPayOrderInfo:后台通过orderID接口拉出 格式为 ...sign=....
                //在mHandler中处理支付宝返回结果
                Message msg = new Message();
                msg.what = 1;
                msg.obj = result;  
                mHandler.sendMessage(msg);
            }
        };
        Thread payThread = new Thread(payRunnable);// 必须异步调用
        payThread.start();
}

在mHandler中处理支付结果

private Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            if (msg.what == 1) {
                /*Toast.makeText(PaymentMethod.this, (String) msg.obj,Toast.LENGTH_LONG).show();//error*/
                PayResult payResult = new PayResult((Map<String,String>) msg.obj);
                /**
                 对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
                 */
                String resultInfo = payResult.getResult();// 同步返回需要验证的信息
                String resultStatus = payResult.getResultStatus();
                if (resultStatus.equals("9000")) {// 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档
                    mytoast.show(getApplicationContext(),"支付成功");
                }else if (resultStatus.equals("4000")){ // 4000为支付失败,包括用户主动取消支付,或者系统返回的错误
                    mytoast.show(getApplicationContext(),"支付失败");
                }else if (resultStatus.equals("6001")){// 6001为取消支付,或者系统返回的错误
                    mytoast.show(getApplicationContext(),"取消支付");
                }else if (resultStatus.equals("8000")) {  // "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)
                    mytoast.show(getApplicationContext(),"支付结果确认中");
                }else {// 其他为系统返回的错误
                    mytoast.show(getApplicationContext(),"支付错误");
                }
                finish();
            }
        }
    };

5、PayResult.java

public class PayResult {
    private String resultStatus;
    private String result;
    private String memo;

    public PayResult(Map<String, String> rawResult) {
        if (rawResult == null) {
            return;
        }

        for (String key : rawResult.keySet()) {
            if (TextUtils.equals(key, "resultStatus")) {
                resultStatus = rawResult.get(key);
            } else if (TextUtils.equals(key, "result")) {
                result = rawResult.get(key);
            } else if (TextUtils.equals(key, "memo")) {
                memo = rawResult.get(key);
            }
        }
    }

    @Override
    public String toString() {
        return "resultStatus={" + resultStatus + "};memo={" + memo
                + "};result={" + result + "}";
    }

    /**
     * @return the resultStatus
     */
    public String getResultStatus() {
        return resultStatus;
    }

    /**
     * @return the memo
     */
    public String getMemo() {
        return memo;
    }

    /**
     * @return the result
     */
    public String getResult() {
        return result;
    }
}

6、备注

https://open.alipay.com/platform/home.htm 开发平台创建应用申请支付能力


第三方支付在我们做app开发中比较常用,所以自己记录了一下,做这篇文章分享给大家,希望可以给大家带来帮助!文章是原创文章,转载请标明出处,谢谢!

2018-04-12 10:47:55 sinat_32961877 阅读数 444

最近项目需求 改版了支付方式,支付宝  微信都切换了 海外版,还集成了paypal,前几天随手记录了一下paypal的集成,

今天 整理一下 支付宝 和微信的,

支付宝 微信 账户申请 应用创建就不说了,截图太麻烦,这里只贴 一些 关键代码片段,

假设 支付宝 微信  账号申请 应用创建 ,后台接口都OK了,接下来:

1,自家后台  接口 获取 支付宝 拼接好的  orderInfo 参数 ,和 调起 微信支付需要的 七个 参数;

然后 传参  发起支付

/**
 * 支付宝 支付
 */
public void goAliPay(final String orderInfo) {
    Runnable payRunnable = new Runnable() {
        @Override
        public void run() {
            //调用支付宝
       PayTask payTask = new PayTask(ConfirmOrderAvtivity.this);
            String result = payTask.pay(orderInfo, true);
            Message msg = new Message();
            msg.what = ALIPAY;
            msg.obj = result;
            mHandler.sendMessage(msg);
        }
    };
    // 必须异步调用
    Thread payThread = new Thread(payRunnable);
    payThread.start();
}
 /**
     * 微信支付
     */
    public void goWeiXinPay(String appid, String partnerid, String prepayid, String noncestr, String timestamp, String packageNmae, String sign) {
      
        //注册 微信APPID
       api = WXAPIFactory.createWXAPI(ConfirmOrderAvtivity.this, Constant.WX_APP_ID, true);
        api = WXAPIFactory.createWXAPI(ConfirmOrderAvtivity.this, null);
        api.registerApp(appid);
        PayReq req = new PayReq();
        req.appId = appid;
        req.partnerId = partnerid;
        req.prepayId = prepayid;
        req.nonceStr = noncestr;
        req.timeStamp = timestamp;
        req.packageValue = packageNmae;
        req.sign = sign;
        // 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
        api.sendReq(req); // 返回的是调取 成功 失败
    }





然后 等待 回调结果,我这里 是做的统一处理,就是根据 回调结果,支付失败 统一弹窗提示,支付成功 跳转支付结果页面,

微信的支付回调 我是 用的eventbus 处理的,收到支付回调,然后发送消息  告诉发起支付页面 支付结果,然后做处理,

因为WXPayEntryActivity 是个activity 页面,按着常规的处理 有时候会闪黑屏 然后跳转到 发起支付页面 很不舒服,不知道别的大佬是怎么处理的,广播的话  就很好的解决的了这个问题,

EventBUS 的话,网上有很多介绍的,这里贴个链接 可以学习一下 https://www.jianshu.com/p/f9ae5691e1bb

大神源码解读:http://a.codekk.com/detail/Android/Trinea/EventBus%20%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90

sweetdialog 是一个很不错的 弹窗  GitHub链接 https://github.com/pedant/sweet-alert-dialog

 



@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
    @SuppressWarnings("unused")
    public void handleMessage(Message msg) {
        switch (msg.what) {
            case ALIPAY: {
                PayResult payResult = new PayResult((String) msg.obj);
                String resultInfo = payResult.getResult();// 同步返回需要验证的信息
                String resultStatus = payResult.getResultStatus();
                if (TextUtils.equals(resultStatus, "9000")) {
                    showMyDialog("1");
                } else {
                    // "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服<span style="white-space:pre">                </span>务端异步通知为准(小概率状态)
                    if (TextUtils.equals(resultStatus, "8000")) {
                        showMyDialog("支付结果确认中...");
                    } else if (TextUtils.equals(resultStatus, "6001")) {
                        showMyDialog("支付取消");
                    } else if (TextUtils.equals(resultStatus, "6002")) {
                        showMyDialog("支付失败");
                    } else if (TextUtils.equals(resultStatus, "5000")) {
                    } else {
                        showMyDialog("支付失败");
                        // 其他值就可以判断为支付失败
                    }
                }
                break;
            }
        }
    }
};

public void showMyDialog(String msg) {
    if (msg.equals("1")) {
        intent = new Intent(ConfirmOrderAvtivity.this, PayResultActivity.class);
        intent.putExtra("from", "ConfirmOrderAvtivity");
        startActivity(intent);
    } else {
        new SweetAlertDialog(ConfirmOrderAvtivity.this, SweetAlertDialog.WARNING_TYPE)
                .setTitleText(msg)
                .setContentText(msg + "!")
                .show();
    }
}

@Subscribe(threadMode = ThreadMode.MAIN)
public void onMoonEvent(MessageEvent messageEvent) {
    if (messageEvent.getMessage().equals("支付成功")) {
        showMyDialog("1");
    } else if (messageEvent.getMessage().equals("支付失败")) {
        showMyDialog(messageEvent.getMessage());
    } else if (messageEvent.getMessage().equals("支付取消")) {
        showMyDialog(messageEvent.getMessage());
    }
}


 

 

WXPayEntryActivity :

 

 

public class WXPayEntryActivity extends BaseActivity implements IWXAPIEventHandler {
    private IWXAPI api;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        setContentView(R.layout.wxpay_bg_layout);
         ActivityManagerUtils.getInstance().addActivity(this);
        api = WXAPIFactory.createWXAPI(WXPayEntryActivity.this, Constant.WX_APP_ID);
        api.handleIntent(getIntent(), WXPayEntryActivity.this);
    }

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

    @Override
    public void onReq(BaseReq baseReq) {

    }

    @Override
    public void onResp(BaseResp resp) {
        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            int code = resp.errCode;
            if (code == 0) {
                //显示充值成功的页面和需要的操作
                EventBus.getDefault().post(new MessageEvent("支付成功"));
            }
            if (code == -1) {
                EventBus.getDefault().post(new MessageEvent("支付失败"));
                //支付失败
            }
            if (code == -2) {
                EventBus.getDefault().post(new MessageEvent("支付取消"));
                //用户取消
            }
            finish();
        }

    }

}

 

 

 

2017-07-05 11:38:42 weixin_38501485 阅读数 946
1 支付宝支付 相对于微信来说支付宝官方demo已经很好了,但是支付宝demo有个缺点就是在demo里面演示的时候把后台和前段做得混到一起了,
   虽然说已经说明了,但是对于刚开始集成的我们来说真的头大,下面我总结一下支付宝客户端要做得事情。


1 确认订单接口
 
 /**
     * 确认订单接口
     * 必填
     * 1107001:微信
     * 1107002:支付宝
     */
    private void VerifyOrderinInfosInterface(String mOrderinfosBean, String payfor) {
        if (null == mProgressDialog) {
            mProgressDialog = new ProgressDialog(SelectOrderInfoActivity.this);
        }
        mProgressDialog.show();
        Map map = new TreeMap();
        map.put(GsonUtils.snTime, String.valueOf(System.currentTimeMillis()));
        map.put(GsonUtils.orderCode, mOrderinfosBean);//订单编号
        map.put(GsonUtils.payWay, payfor);//支付方式
        Map<String, String> resultMap = GsonUtils.sortMapByKey(map); // 按Key进行排序
        String sn = GsonUtils.buildSN(resultMap);
        try {
            sn = URLEncoder.encode(sn, "UTF-8");
            sn = MD5Coder.getMD5Code(sn);
        } catch (UnsupportedEncodingException e1) {
            e1.printStackTrace();
        }
        map.put(GsonUtils.sn, sn);
        String json = GsonUtils.buildJson(map);


        try {
            NetUtils.getmInstance().postJsons(NetGlobalParams.CAPTIONINITOKINFO, json, new StringCallback() {
                @Override
                public void onError(Call call, Exception e, int id) {
                    UIHelper.ToastMessage(SelectOrderInfoActivity.this, "网络连接超时");
                    mProgressDialog.dismiss();
                }


                @Override
                public void onResponse(String response, int id) {
                    mPayWayBeans = GsonUtils.GsonToBean(response, PayWayBeans.class);
                    if (mPayWayBeans.getStatus() == 0) {//请求成功
                        Log.i(response, "onResponse: " + response);
                        //得到订单编号
                        //  String ppayFororderCode = mPayWayBeans.getDetail().getOrderCode();
                        //获取签名后的订单信息 ,需要订单编号和订单金额
                        if (orderCode != null) {
                            getAlipayOderInfo(orderCode, mPriceTotal);
                            //得到签名订单信息后调用支付宝pay方法支付
                        }
                    }
                }




            });


        } catch (Exception e) {
            e.printStackTrace();
        }


    }
2 获取签名后的订单信息
 /**
     * 获取订单签名后的信息
     *
     * @param payFororderCode
     * @param mPriceTotal
     */
    private void getAlipayOderInfo(String payFororderCode, double mPriceTotal) {
        Map map = new TreeMap();
        map.put(GsonUtils.snTime, String.valueOf(System.currentTimeMillis()));
        if (!MyApplication.getInstance().getPreferencesUtils().getUserid().equals("")) {
            map.put(GsonUtils.userId, MyApplication.getInstance().getPreferencesUtils().getUserid());
            map.put(GsonUtils.sessionId, MyApplication.getInstance().getPreferencesUtils().getSessionid());//订单编号
        }
        map.put(GsonUtils.out_trade_no, payFororderCode);//订单编号
        map.put(GsonUtils.total_amount, String.valueOf(mPriceTotal));
        Map<String, String> resultMap = GsonUtils.sortMapByKey(map); // 按Key进行排序
        String sn = GsonUtils.buildSN(resultMap);
        try {
            sn = URLEncoder.encode(sn, "UTF-8");
            sn = MD5Coder.getMD5Code(sn);
        } catch (UnsupportedEncodingException e1) {
            e1.printStackTrace();
        }
        map.put(GsonUtils.sn, sn);
        String json = GsonUtils.buildJson(map);


        try {
            NetUtils.getmInstance().postJsons(NetGlobalParams.APLPAYAPP, json, new StringCallback() {
                @Override
                public void onError(Call call, Exception e, int id) {
                    Log.i("onError", "onResponse: " + e);
                }


                @Override
                public void onResponse(String response, int id) {
                    Log.i("responseres", "onResponse: " + response);
                    //  alipay(fffff);
                    mPayForApp = GsonUtils.GsonToBean(response, PayForApp.class);
                    if (mPayForApp != null) {
                        if (mPayForApp.getStatus() == 0) {//请求成功
                            String detail = mPayForApp.getDetail();
                            alipay(detail);
                            mProgressDialog.dismiss();
                        }
                    }


                }




            });


        } catch (Exception e) {
            e.printStackTrace();
        }


    }


}




3 同步通知自己的app支付结果;(注意异步的已经交给后台了,后台那边支付结果会相应的修改订单状态的)
 private void alipay(final String orderInfo) {


        Runnable payRunnable = new Runnable() {


            @Override
            public void run() {
                PayTask alipay = new PayTask(SelectOrderInfoActivity.this);
                Map<String, String> result = alipay.payV2(orderInfo, true);
                Log.i("msp", result.toString());


                Message msg = new Message();
                msg.what = 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 SDK_PAY_FLAG: {
                    @SuppressWarnings("unchecked")
                    PayResult payResult = new PayResult((Map<String, String>) msg.obj);
                    /**
                     对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
                     */
                    String resultInfo = payResult.getResult();// 同步返回需要验证的信息
                    String resultStatus = payResult.getResultStatus();
                    // 判断resultStatus 为9000则代表支付成功
                    if (TextUtils.equals(resultStatus, "9000")) {
                        // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
                        Toast.makeText(SelectOrderInfoActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
                        finish();
                    } else {
                        // 该笔订单真实的支付结果,需要依赖服务端的异步通知。
                        Toast.makeText(SelectOrderInfoActivity.this, "支付失败", Toast.LENGTH_SHORT).show();


                    }
                    break;
                }
                case SDK_AUTH_FLAG:




                default:
                    break;
            }
        }


        ;
    };




  支付宝支付很简单没有像微信那样有很多坑,加密,私钥,商户id等都在后台做,前端只需要传入订单账号和支付的选择方式即可
2 微信支付


  微信支付坑太多,主要总结一下和对应的解决方法


        1 WXpayEntryActivity 包名和类名必须一致;坑------微信demo里面的是WXEntryActivity导致支付不了
        2 清单文件 
          
     <activity
            android:name="com.dplustours.b2c.wxapi.WXPayEntryActivity"
            android:exported="true"
            android:label="@string/app_name"
            android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:scheme="你自己的appid" />
            </intent-filter>
        </activity>
        <receiver
            android:name="com.dplustours.b2c.View.receiver.AppRegister"
            android:permission="com.tencent.mm.plugin.permission.SEND">
            <intent-filter>
                <action android:name="com.tencent.mm.plugin.openapi.Intent.ACTION_REFRESH_WXAPP" />
            </intent-filter>
        </receiver>
 3 微信支付没有网页支付,ios那边有时候会跳转出来,反正android没有 支付宝有网页支付,多以支付前要判断微信客户端安装了没有


4 打包签名,这个是最重要的,签名的keystore要和平台申请的一致,微信测试必须要签名打包去验证平台的key,验证成功才可以打开app里面的微信支付页面,要是 打不开就去找申请负责的人,去验证keystore的MD5字符串是否正确
 
      
 /**
     * 判断微信客户端是否存在
     *
     * @param appid
     * @return
     */
    private boolean isWXAppInstalledAndSupported(String appid) {
        IWXAPI msgApi = WXAPIFactory.createWXAPI(this, null);
        msgApi.registerApp(appid);


        boolean sIsWXAppInstalledAndSupported = msgApi.isWXAppInstalled() ;//&& msgApi.isWXAppSupportAPI()


        return sIsWXAppInstalledAndSupported;
    }


下面是微信支付流程,客户端走流程


 /**
     * 微信支付
     *
     * @param orderCode
     * @param s
     */
    private void VerifyOrderinInfosInterfaceWeixin(final String orderCode, String s) {
        if (null == mProgressDialog) {
            mProgressDialog = new ProgressDialog(SelectOrderInfoActivity.this);
        }
        mProgressDialog.show();
        Map map = new TreeMap();
        map.put(GsonUtils.snTime, String.valueOf(System.currentTimeMillis()));
        map.put(GsonUtils.orderCode, orderCode);//订单编号
        map.put(GsonUtils.payWay, s);//支付方式
        Map<String, String> resultMap = GsonUtils.sortMapByKey(map); // 按Key进行排序
        String sn = GsonUtils.buildSN(resultMap);
        try {
            sn = URLEncoder.encode(sn, "UTF-8");
            sn = MD5Coder.getMD5Code(sn);
        } catch (UnsupportedEncodingException e1) {
            e1.printStackTrace();
        }
        map.put(GsonUtils.sn, sn);
        String json = GsonUtils.buildJson(map);


        try {
            NetUtils.getmInstance().postJsons(NetGlobalParams.CAPTIONINITOKINFO, json, new StringCallback() {
                @Override
                public void onError(Call call, Exception e, int id) {
                    UIHelper.ToastMessage(SelectOrderInfoActivity.this, "网络连接超时");
                    mProgressDialog.dismiss();
                }


                @Override
                public void onResponse(String response, int id) {
                    mPayWayBeans = GsonUtils.GsonToBean(response, PayWayBeans.class);
                    if (mPayWayBeans.getStatus() == 0) {//请求成功
                        Log.i(response, "onResponse: " + response);
                        //得到订单编号
                        //  String ppayFororderCode = mPayWayBeans.getDetail().getOrderCode();
                        //获取签名后的订单信息 ,需要订单编号和订单金额


                        if (orderCode != null) {
                            getAlipayOderInfoWeixing(orderCode);
                            //得到签名订单信息后调用支付宝pay方法支付




                        }


                    }
                }




            });


        } catch (Exception e) {
            e.printStackTrace();
        }
    }




  /**
     * 微信zhifu
     *
     * @param orderCode
     */
    private void getAlipayOderInfoWeixing(String orderCode) {
        Map map = new TreeMap();
//        map.put(GsonUtils.snTime, String.valueOf(System.currentTimeMillis()));
//        if (MyApplication.getInstance().getPreferencesUtils().getUserid() != null && MyApplication.getInstance().getPreferencesUtils().getSessionid() != null) {
//            map.put(GsonUtils.userId, MyApplication.getInstance().getPreferencesUtils().getUserid().toString());
//            map.put(GsonUtils.sessionId, MyApplication.getInstance().getPreferencesUtils().getSessionid().toString());
//        }
//        map.put(GsonUtils.out_trade_no, orderCode);//订单编号
//        Map<String, String> resultMap = GsonUtils.sortMapByKey(map); // 按Key进行排序
//        String sn = GsonUtils.buildSN(resultMap);
//
        map.put(GsonUtils.snTime, String.valueOf(System.currentTimeMillis()));
        if (!MyApplication.getInstance().getPreferencesUtils().getUserid().equals("")) {
            map.put(GsonUtils.userId, MyApplication.getInstance().getPreferencesUtils().getUserid());
            map.put(GsonUtils.sessionId, MyApplication.getInstance().getPreferencesUtils().getSessionid());//订单编号
        }
        map.put(GsonUtils.out_trade_no, orderCode);//订单编号
        map.put(GsonUtils.total_amount, String.valueOf(mPriceTotal));
        Map<String, String> resultMap = GsonUtils.sortMapByKey(map); // 按Key进行排序
        String sn = GsonUtils.buildSN(resultMap);
        try {
            sn = URLEncoder.encode(sn, "UTF-8");
            sn = MD5Coder.getMD5Code(sn);
        } catch (UnsupportedEncodingException e1) {
            e1.printStackTrace();
        }
        map.put(GsonUtils.sn, sn);
        String json = GsonUtils.buildJson(map);


        try {
            NetUtils.getmInstance().postJsons(NetGlobalParams.PAYWEIXIN, json, new StringCallback() {
                @Override
                public void onError(Call call, Exception e, int id) {
                    UIHelper.ToastMessage(SelectOrderInfoActivity.this, "网络连接超时");
                    mProgressDialog.dismiss();
                }


                @Override
                public void onResponse(String response, int id) {
                    Log.i(response, "onResponse: " + response);
                    mProgressDialog.dismiss();
                    try {
                        PayWayWeixinBeans mPayWayWeixinBeans = GsonUtils.GsonToBean(response, PayWayWeixinBeans.class);
                        if (mPayWayWeixinBeans != null) {
                            if (mPayWayWeixinBeans.getDetail() != null) {


                                //开始跳转到微信界面进行支付
                                String appid = mPayWayWeixinBeans.getDetail().getAppid();
                                String timestamp = mPayWayWeixinBeans.getDetail().getTimestamp();
                                String noncestr = mPayWayWeixinBeans.getDetail().getNoncestr();
                                String packageX = mPayWayWeixinBeans.getDetail().getPackageX();
                                String partnerid = mPayWayWeixinBeans.getDetail().getPartnerid();
                                String sign = mPayWayWeixinBeans.getDetail().getSign();
                                String prepayid = mPayWayWeixinBeans.getDetail().getPrepayid();
                                //开始调用微信支付
                                StartWinxinPayFor(appid, timestamp, noncestr, packageX, partnerid, sign, prepayid);


                            }
                        }
                    } catch (Exception e) {
                        UIHelper.ToastMessage(SelectOrderInfoActivity.this, "数据格式错误");
                    }


                }




            });


        } catch (Exception e) {
            e.printStackTrace();
        }
    }




 /**
     * app微信支付参数
     *
     * @param appid
     * @param timestamp
     * @param noncestr
     * @param packageX
     * @param partnerid
     * @param sign
     * @param prepayid
     */
    private void StartWinxinPayFor(String appid, String timestamp, String noncestr, String packageX, String partnerid, String sign, String prepayid) {
        // 将该app注册到微信
        if (isWXAppInstalledAndSupported(appid)) {
            MyApplication.getInstance().getPreferencesUtils().clearOdercode();
            MyApplication.getInstance().getPreferencesUtils().clearselectWay();
            MyApplication.getInstance().getPreferencesUtils().setOrderCode(orderCode);
            MyApplication.getInstance().getPreferencesUtils().setselectWay(selectWay);
            msgApi = WXAPIFactory.createWXAPI(SelectOrderInfoActivity.this, null);
            msgApi.registerApp(appid);
            PayReq request = new PayReq();
            request.appId = appid;
            request.partnerId = partnerid;
            request.prepayId = prepayid;
            request.packageValue = packageX;
            request.nonceStr = noncestr;
            request.timeStamp = timestamp;
            request.sign = sign;
            msgApi.sendReq(request);


        } else {
            Toast.makeText(this, "请安装微信客户端", Toast.LENGTH_LONG).show();
        }
    }


    /**
     * 判断微信客户端是否存在
     *
     * @param appid
     * @return
     */
    private boolean isWXAppInstalledAndSupported(String appid) {
        IWXAPI msgApi = WXAPIFactory.createWXAPI(this, null);
        msgApi.registerApp(appid);


        boolean sIsWXAppInstalledAndSupported = msgApi.isWXAppInstalled() ;//&& msgApi.isWXAppSupportAPI()


        return sIsWXAppInstalledAndSupported;
    }
2017-05-04 19:53:42 wb1276831936 阅读数 3536

先放上接入两个支付平台的官方文档地址

支付宝官方demo下载

微信官方demo下载


一、支付宝支付

导入开发资源


1.将支付宝demo中的jar包alipay-sdk-common/alipaySdk-xxxxxxxx.jar放到项目目录libs/文件夹下。如下图:

这里写图片描述

2.在Jar包右键选择Add As Library。如下图:

这里写图片描述

修改AndroidMenifest文件


在商户应用工程的AndroidManifest.xml文件里面添加声明:

<activity
            android:name="com.alipay.sdk.app.H5PayActivity"
            android:configChanges="orientation|keyboardHidden|navigation"
            android:exported="false"
            android:screenOrientation="behind" >
</activity>
<activity
            android:name="com.alipay.sdk.auth.AuthActivity"
            android:configChanges="orientation|keyboardHidden|navigation"
            android:exported="false"
            android:screenOrientation="behind" >
 </activity>

和权限声明:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

添加混淆规则


-libraryjars libs/alipaySingle-20161222.jar

-keep class com.alipay.android.app.IAlixPay{*;}
-keep class com.alipay.android.app.IAlixPay$Stub{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}
-keep class com.alipay.sdk.app.PayTask{ public *;}
-keep class com.alipay.sdk.app.AuthTask{ public *;}

支付接口调用


需要在非UI线程中调用,示例:

    private static final int SDK_PAY_FLAG = 1;
    private static final int SDK_AUTH_FLAG = 2;

    /**
     * 支付宝
     */
    private void alipay(String orderInfo)
    {
        final String mOrderInfo = orderInfo;   // 订单信息

        Runnable payRunnable = new Runnable() {

            @Override
            public void run()
            {
                PayTask alipay = new PayTask(PaymentActivity.this);
                Map<String, String> result = alipay.payV2(mOrderInfo, true);

                Message msg = new Message();
                msg.what = SDK_PAY_FLAG;
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        };
        // 必须异步调用
        Thread payThread = new Thread(payRunnable);
        payThread.start();
    }

orderInfo字符串解释:

该字符串类似于

app_id=2015052600090779&biz_content=%7B%22timeout_express%22%3A%2230m%22%2C%22seller_id%22%3A%22%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22total_amount%22%3A%220.02%22%2C%22subject%22%3A%221%22%2C%22body%22%3A%22%E6%88%91%E6%98%AF%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE%22%2C%22out_trade_no%22%3A%22314VYGIAGG7ZOYY%22%7D&charset=utf-8&method=alipay.trade.app.pay&sign_type=RSA2&timestamp=2016-08-15%2012%3A12%3A15&version=1.0&sign=MsbylYkCzlfYLy9PeRwUUIg9nZPeN9SfXPNavUCroGKR5Kqvx0nEnd3eRmKxJuthNUx4ERCXe552EV9PfwexqW%2B1wbKOdYtDIb4%2B7PL3Pc94RZL0zKaWcaY3tSL89%2FuAVUsQuFqEJdhIukuKygrXucvejOUgTCfoUdwTi7z%2BZzQ%3D

是由后台服务器拼接完成,安卓端拿到这串字符串调用支付方法即可。如下图:
这里写图片描述

支付结果获取和处理


Intent mIntent;

@SuppressWarnings("unchecked")
private Handler mHandler = new Handler() {
    public void handleMessage(Message msg)
    {
        switch (msg.what)
        {
            case SDK_PAY_FLAG:
                /**
                 对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
                 */
                PayResult result = new PayResult((Map<String, String>) msg.obj);
                String resultStatus = result.getResultStatus();
                // 判断resultStatus 为9000则代表支付成功
                if (TextUtils.equals(resultStatus, "9000"))
                {
                    //支付成功跳转订单详情页面,以下作示例代码,可删除
                    mIntent = new Intent(PaymentActivity.this, OrderDetialActivity.class);
                    startActivity(mIntent);
                    //跳转动画
                    overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
                    finish();                    
                } else
                {
                    pd.dismiss();
                    // 该笔订单真实的支付结果,需要依赖服务端的异步通知,建议在订单详情页面获取服务器端商品支付状态。
                    Toast.makeText(PaymentActivity.this, "支付失败", Toast.LENGTH_SHORT).show();
                }
                break;
            case SDK_AUTH_FLAG:

                break;
        }
    };
};

获取当前开发包版本号


调用PayTask 的getVersion()获取当前开发包的版本号

PayTask payTask = new PayTask(activity);
String version = payTask.getVersion();

至此支付宝Android支付接入完成

二、微信支付

导入开发资源


1.将微信支付jar包放到项目目录libs/文件夹下。如下图:

这里写图片描述

2.在Jar包右键选择Add As Library。

后台设置


商户在微信开放平台申请开发应用后,微信开放平台会生成APP的唯一标识APPID。由于需要保证支付安全,需要在开放平台绑定商户应用包名和应用签名,设置好后才能正常发起支付。设置界面在【开放平台】中的栏目【管理中心 / 修改应用 / 修改开发信息】里面,如图所示:
这里写图片描述

应用包名:是在APP项目配置文件AndroidManifest.xml中声明的package值,例如DEMO中的package="net.sourceforge.simcpux"

应用签名:根据项目的应用包名和编译使用的keystore,可由签名工具生成一个32位的md5串,在调试的手机上安装签名工具后,运行可生成应用签名串,如图8.9所示,绿色串即应用签名。签名工具下载地址
https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk

这里写图片描述

注册APPID


商户APP工程中引入微信JAR包,调用API前,需要先向微信注册您的APPID,代码如下:

public class MyApplication extends Application {

    IWXAPI msgApi = null;

    @Override
    public void onCreate()
    {
            msgApi = WXAPIFactory.createWXAPI(this, null);
            // 将该app注册到微信
            msgApi.registerApp(Constant.WX_APP_ID);
    }
}

Constant.java代码

public class Constant {
    //appid 微信分配的公众账号ID              
    public static final String WX_APP_ID = "wxc2d0381e95948db6";
    //商户号 微信分配的公众账号ID
    public static final String WX_MCH_ID = "1432223602";
    //API密钥,在商户平台设置
    public static final String WX_API_KEY = "";
}

这段代码也可以在ActivityonCreate()方法中初始化,视情况而定,建议在Application中初始化

final IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);

// 将该app注册到微信

msgApi.registerApp(Constant.WX_APP_ID);

调起支付


下面是调起支付核心代码

private void startVXInPay(String appid, String mch_id, String nonce_str,
                        String sign, String prepay_id, String trade_type, String time)
    {
        PayReq request = new PayReq();
        //应用ID 微信开放平台审核通过的应用APPID
        request.appId = appid;
        //商户号  微信支付分配的商户号
        request.partnerId = mch_id;
        //预支付交易会话ID  微信返回的支付交易会话ID
        request.prepayId = prepay_id;
        //扩展字段  暂填写固定值Sign=WXPay
        request.packageValue = "Sign=WXPay";
        //随机字符串 随机字符串,不长于32位。推荐
        //随机数生成算法url:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=4_3
        request.nonceStr = nonce_str;
        //时间戳 标准北京时间,时区为东八区,自1970年1月1日 0点0分0秒以来的秒数。
        // 注意:部分系统取到的值为毫秒级,需要转换成秒(10位数字)。
        request.timeStamp = time;// "" + (new DecimalFormat("0")).format(System.currentTimeMillis() / 1000);
        //签名  签名,详见 url:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=4_3
        request.sign = sign;//sign
        api.sendReq(request);//调起支付
    }

PayReq的相关参数从后台服务器获取,如

String mAppid, mMch_id, mNonce_str, mSign, mPrepay_id, mTrade_type;
String mTime;

Map<String,String> headers,params;
String url,token;

public void getVXPaymentInfo()
{
    headers.clear();
    if (!TextUtils.isEmpty(token))
    {
        headers.put("Token", token);
    }
    params.clear();
    params.put("pay_sys", "Android");
    params.put("log_id", log_id);
    url = URLS.USER_GET_VX_PAYMENTINFO;
        OkHttpUtils.post().url(url).headers(headers).params(params).build().execute(new StringCallback() {
        @Override
        public void onError(Call call, Exception e, int id)
        {
            MToast.shortToast(getString(R.string.huoqushujushibai));
        }

        @Override
        public void onResponse(String response, int id)
        {
            if (TextUtils.isEmpty(response))
            {
                return;
            }
            //解析服务器返回的json字符串
            JSONObject jsonObject = JSONObject.parseObject(response);
            boolean success = jsonObject.getBooleanValue("success");
            if (success)
            {
                JSONObject resultObject = JSON.parseObject(jsonObject.getString("app_need"));
                mAppid = resultObject.getString("appid");
                mMch_id = resultObject.getString("partnerid");
                mNonce_str = resultObject.getString("noncestr");
                mSign = resultObject.getString("sign");
                mPrepay_id = resultObject.getString("prepayid");
                mTrade_type = "APP";
                mTime = resultObject.getString("timestamp");
                //调用微信支付代码
                startVXInPay(mAppid, mMch_id, mNonce_str, mSign, mPrepay_id, mTrade_type, mTime);
            } else
            {
                MToast.shortToast(jsonObject.getString("error_msg"));
            }
        }
    });
}

支付结果回调


在项目中新建package wxapi,并新建Activity WXPayEntryActivity,名称必须一样,如下:

这里写图片描述

AndroidManifest注册WXPayEntryActivity

<!-- 微信支付 -->
<activity
    android:name=".wxapi.WXPayEntryActivity"
    android:exported="true"
    android:launchMode="singleTop"
    android:screenOrientation="portrait"/>

WXPayEntryActivity需要实现 IWXAPIEventHandler接口,

public class WXPayEntryActivity extends BaseActivity implements IWXAPIEventHandler {

 @Override
    public void onCreate(Bundle savedInstanceState, Object obj)
    {
        //不需要设置contentView
    }

    // 微信发送请求到第三方应用时,会回调到该方法
    @Override
    public void onReq(BaseReq req)
    {

    }

    // 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法
    @Override
    public void onResp(BaseResp resp)
    {
        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX)
        {
            if (resp.errCode == -2)
            {
                //支付取消,在这里做相应逻辑
            }else if(resp.errCode == 0){
                //支付成功,建议依赖服务器返回结果,这里可以跳转到详情界面查询订单信息
            }            
        }
    }

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

回调中errCode值列表:

名称 描述 解决方案
0 成功 展示成功页面
-1 错误 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
-2 用户取消 无需处理。发生场景:用户不支付了,点击取消,返回APP。

至此微信支付接入完毕

没有更多推荐了,返回首页