Android 微信支付快速接入

接入流程

1.申请开发者资质

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

使用公司管理者/高层帐号登录微信开放平台,进入“账号中心”,进行开发者资质认证,需要填写公司资料,包括但不限于,公司注册号,公司营业执照,公司对外办公电话,公司对公银行卡信息(卡号,发卡行)。审核时间为一周左右。
备注:因为从2015年10月1日起,国家实行三证(组织机构代码证,企业营业执照,税务登记证)合一,所以组织机构代码处填写-工商执照注册号,同样,组织机构代码证,上传-企业工商营业执照。 

备注2:进行开发者资质认证需要支付300元人名币/年,只有具备开发者资质认证的开发者才能够使用app支付,授权登录等接口。【科学上网软件点击下载(能上youtube、facebook,享受google服务)】

2.申请APP_ID/APP_KEY 

每个应用/游戏要调用微信的接口都需要有一个微信标志,这个唯一标志通常成为APP_ID或者APP_KEY,各开放平台差异不大 
进入管理中心,创建移动应用,每个开发者具有10个应用的创建机会,好在创建的应用可以随时删除。已上线的应用就不建议手贱删除!! 
申请appid需要填写应用信息:应用名称,包名,签名(keystore的md5值去分号小写),icon(28*28 & 108*108),app下载地址等信息,即可分配到一个appid。 
备注:测试支付时,务必使用申请时填写的keystore文件签名,包名也需要核对清楚,必然无法调起支付,返回-1错误码。

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

4.代码集成微信支付 

支付流程图 

这里写图片描述

先说下微信支付吧,毕竟相对于支付而言,还是支付宝简单快速一点,就留到后面说了

1.如果你已经成功集成了微信登录和分享,直接用你的 libammsdk.jar和 WECHAT_APP_ID就可以了, 那么下面帮你快速集成微信支付。

2.接入前可以看看上面链接的文档,不过微信官方的文档写的不够好,好多开发者吐槽,至今也没改善点啥。
3.好了直接说接入,接入微信支付SDK前准备下面三个东西,如果你集成了微信分享,登录那只需要一个 WXPayEntryActivity 类就行了
① 微信支付的APPID
② 微信支付依赖包 -------- libammsdk.jar
③ 一个Activity类 ----------- WXPayEntryActivity

  • 这里需要特别说明一下,这个WXPayEntryActivity 类,直接从微信官方下载的Demo代码中copy到自己的工程中即可,这个页面是在你调起微信支付完成支付(或取消或失败)后,再回到你的App时会调用的一个页面。页面的布局可以是你自定义的布局(一般做法是直接注释掉这个布局)
    网上copy的一张图讲解:
WXPayEntryActivity 的路径

4、WXPayEntryActivity中的布局是可以自定义的,如果你不需要展示什么布局,而是要跳转页面,把这段代码删除即可

/**
 * -Created by Luke on 2017/2/14.
 */
public class WXPayEntryActivity extends AppCompatActivity  {
    private static final String TAG = WXPayEntryActivity.class.getSimpleName();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // setContentView(R.layout.pay_result);
        BaseApplication.api.handleIntent(getIntent(), this);
    }
}
WECHAT_APP_ID 已经在BaseApplication中定义了 在这里不需要再写

5.下面是回调的逻辑,官方是这样的图

官方回调页面
  • 我这边就简单的演示下支付成功的地方
    @Override
    public void onResp(BaseResp resp) {

        LogUtil.d(TAG, "Luke = " + resp.toString());
        
        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            int code = resp.errCode;
            switch (code) {
                case 0:
                    ToastUtil.show("支付成功");
                    break;
                case -1:
                    ToastUtil.show("支付失败");
                    finish();
                    break;
                case -2:
                    ToastUtil.show("支付取消");
                    finish();
                    break;
                default:
                    ToastUtil.show("支付失败");
                    setResult(RESULT_OK);
                    finish();
                    break;
            }
        }
    }

接下来咱就把这个WXPayEntryActivity放在清单manifest文件里面注册,然后加上exported属性,设置为true:

<activity
            android:name=".wxapi.WXPayEntryActivity"
            android:exported="true"
            android:launchMode="singleTop"
            android:theme="@style/Theme.AppCompat.NoActionBar"/>
注意的地方:
  • 0 成功 展示成功页面
  • -1 错误 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
  • -2 用户取消 无需处理。发生场景:用户不支付了,点击取消,返回APP。

6.这个类中的其余的回调方法,我们都不需要去操作。然后我们就可以开始支付了,蛮简单

  • 下面是请求的参数列表,我们都是服务器端返回,包括APPID,直接用已经正式的sign。
  • 大概的支付流程是
    ① 点击支付的时候创建订单,获取订单号orderNumber (或者在需要获取订单号的时候获取)
    ② 通过你的价格和这个orderNumber去请求微信返回的一堆参数,以及调起支付页面:
    下面是关键的一步:

//PrePayWeChatEntity 服务器返回给我们微信支付的参数

private void WeChatPay(PrePayWeChatEntity data) {

        if (null == data) {
             //判断是否为空。丢一个toast,给个提示。比如服务器异常,错误啥的
            return;
        }

        IWXAPI api = WXAPIFactory.createWXAPI(this, data.getAppid());
        
        if (!isWXAppInstalledAndSupported(api)) {
            // throw new WeChartNoFoundException();
            ToastUtil.show(getString(R.string.text_uninstalled_wchat));
            
            return;
        }

        //data  根据服务器返回的json数据创建的实体类对象
        PayReq req = new PayReq();

        req.appId = data.getAppid();
        
        req.partnerId = data.getPartnerid();
        
        req.prepayId = data.getPrepayid();
        
        req.packageValue = data.getPkgstr();
        
        req.nonceStr = data.getNoncestr();
        
        req.timeStamp = data.getTimestamp();
        
        req.sign = data.getSign();

        api.registerApp(data.getAppid());
        
        //发起请求
        api.sendReq(req);
    }

7.到这就是成功了,调起了微信支付。再回到 WXPayEntryActivity 中去判断成功后的动作,例如支付完成跳转一个成功的页面finish();也许是用户取消,和异常的支付失败,可以在这个逻辑中去请求订单的状态是怎么样的。
8.最后一个问题就是关于微信开放平台签名的问题。只要你手机上的程序的签名和你在微信平台登记的签名一致即可,无论是debug版本,还是release版本,都是可以的,默认都可以用release的签名

填坑:

一、签名

一定要在开放平台为自己的APP配置正确的包名和签名(签名:将APP打一个正式环境的包,然后在微信开放平台下载签名工具进行签名)。

二、打包测试

和微信的第三方登录一样,必须要打正式包,不是debug的,来进行测试,这样就没有办法调试了,感觉很不爽。所以提供一个办法来拯救一下嘿嘿:

在build.gradle文件中设置debug环境和relealse环境的签名相同就可以解决这个文通了,已经试过了,可以的。

 signingConfigs {

        release {
            //.jks文件放在项目目录
            storeFile file("xxx.jks")
            storePassword "xxx"
            keyAlias "xxx.release"
            keyPassword "xxx"
        }
        debug {
            //.jks文件放在项目目录
            storeFile file("xxx.jks")
            storePassword "xxx"
            keyAlias "xxx.release"
            keyPassword "xxx"
        }
    }


三、当支付时,微信尚未登录,得不到任何回调,如果调起支付时有弹窗进度框,并且你想在得到响应码后让它消失是行不通的,需要在跳出的onStop中处理进度条,不然未登录并且用户取消了支付时进度条无法消失。 四、当支付时,WXPayEntryActivity会以透明的形式启动,所以你可能需要在支付完成得到支付响应码后手动finish该activity,不然你自己写的支付页面的activity需要返回两次才能退出,因为第一次按下back键实际是finish掉WXPayEntryActivity.第二次才是你自己的activity.

猜你喜欢

转载自blog.csdn.net/sunny2come/article/details/80237907
今日推荐