第三方支付之微信支付

前言

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

接入流程

1.申请开发者资质

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

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

2.申请APP_ID/APP_KEY

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

3.申请支付能力

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

4.代码集成微信支付

第三方支付之微信支付_第1张图片
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返回的,不能改整个名字不然看不到回调结果。

 




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);// 支付结果码
}

}

第三方支付之微信支付_第2张图片
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

你可能感兴趣的:(第三方支付之微信支付)