美文网首页
第三方支付之微信支付

第三方支付之微信支付

作者: fengyongge | 来源:发表于2016-08-05 16:55 被阅读464次

    前言

    上一篇写了支付宝支付,这一篇说下微信支付,废话不多说直接开门见山

    接入流程

    1.申请开发者资质

    地址:https://open.weixin.qq.com/

    使用公司管理者/高层帐号登录微信开放平台,进入“账号中心”,进行开发者资质认证,需要填写公司资料,包括但不限于,公司注册号,公司营业执照,公司对外办公电话,公司对公银行卡信息(卡号,发卡行)。审核时间为一周左右。

    2.申请APP_ID/APP_KEY

    每个应用/游戏要调用微信的接口都需要有一个微信标志,这个唯一标志通常成为APP_ID或者APP_KEY,各开放平台差异不大
    进入管理中心,创建移动应用,每个开发者具有10个应用的创建机会。
    备注:测试支付时,务必使用申请时填写的keystore文件签名,包名也需要核对清楚,必然无法调起支付,返回-1错误码。

    3.申请支付能力

    在管理中心,查看需要集成支付能力的app,找到“微信支付”一栏,点击右侧“申请开通”,填写一些企业信息后等待审核,审核时间为一周左右,审核通过后,会得到一个企业商户号及密码,对公银行卡中将收到几分钱,进入商户平台,输入收到的金钱金额以验证。验证通过后即可开始集成支付调用。在这之前,调用支付接口是无法完成支付的。

    4.代码集成微信支付

    APP支付时序图

    这一个是微信官网提供的App支付时序图,商户系统和微信支付系统主要交互说明:
    步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。
    步骤2:商户后台收到用户支付单,调用微信支付统一下单接口。参见【统一下单API】。
    步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay
    步骤4:商户APP调起微信支付。api参见本章节【app端开发步骤说明】
    步骤5:商户后台接收支付通知。api参见【支付结果通知API】
    步骤6:商户后台查询支付结果。,api参见【查询订单API】

    说这么复杂,其实整个流程,App做的就是从后台取到的微信支付需要的参数,然后调起微信,微信返回支付结果,然后微信服务器异步回调给我们自己后台服务器。
    1:Eclipse添加jar包,Android studio添加依赖库
    2:修改清单文件(添加权限、注册activity),其中微信的回调结果是通过他们定义好的在wxapi包下的一个叫WXPayEntryActivity返回的,不能改整个名字不然看不到回调结果。

     <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    
    <activity
      android:name=".wxapi.WXPayEntryActivity"
       android:exported="true"
       android:launchMode="singleTop"/>
    

    3:首先根据后台返回参数,调起微信

    IWXAPI mWxApi = WXAPIFactory.createWXAPI(mContext, WX_APPID, true);
    PayReq req = new PayReq();
    mWxApi.registerApp(WX_APPID);
    
            /**
             * 请求app服务器得到的回调结果
             */
            @Override
            public void onSuccess(JSONObject jsonObject) {
                if (mWxApi != null) {
                    PayReq req = new PayReq();
    
                    req.appId = WX_APPID;// 微信开放平台审核通过的应用APPID
                    try {
                        req.partnerId = jsonObject.getString("partnerid");// 微信支付分配的商户号
                        req.prepayId = jsonObject.getString("prepayid");// 预支付订单号,app服务器调用“统一下单”接口获取
                        req.nonceStr = jsonObject.getString("noncestr");// 随机字符串,不长于32位,服务器小哥会给咱生成
                        req.timeStamp = jsonObject.getString("timestamp");// 时间戳
                        req.packageValue = jsonObject.getString("package");// 固定值Sign=WXPay,可以直接写死,服务器返回的也是这个固定值
                        req.sign = jsonObject.getString("sign");// 签名,后台根据据:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=4_3指导得到这个
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    mWxApi.sendReq(req);
                    Log.d("发起微信支付申请");
                }
            }
    

    4:查看支付结果

    public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{
    private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";
    private IWXAPI api;
    private static final String APP_ID = "your app id";
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.pay_result);
        api = WXAPIFactory.createWXAPI(this, APP_ID);
        api.handleIntent(getIntent(), this);
    }
    
    @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 resp) {
        Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);// 支付结果码
    }
    

    }

    errCode值

    最后提醒大家注意坑点:
    1:测试微信支付需要给微信开放平台的签名改成你的未签名,因为签名后的apk你看不到debug日志,但是上线时要改成正式打包的apk签名。
    2:当支付时,微信尚未登录,得不到任何回调,如果调起支付时有弹窗进度框,并且你想在得到响应码后让它消失是行不通的,需要在跳出的onStop中处理进度条,不然未登录并且用户取消了支付时进度条无法消失。
    3:当支付时,WXPayEntryActivity会以透明的形式启动,所以你可能需要在支付完成得到支付响应码后手动finish该activity,不然你自己写的支付页面的activity需要返回两次才能退出,因为第一次按下back键实际是finish掉WXPayEntryActivity.第二次才是你自己的activity.

    这就是微信支付集成的所有流程,最后附一个官方demo

    https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1

    相关文章

      网友评论

          本文标题:第三方支付之微信支付

          本文链接:https://www.haomeiwen.com/subject/utahsttx.html