• Android app 第三方微信支付接入详解


    微信支付做了好几遍了,都没有出现什么棘手的问题,下面一一为大家分享一下,欢迎吐槽。
    还是老样子,接入微信的支付要第一步添加微信支付官方的包libammsdk.jar

    首先就处理略坑的一个问题,app应用签名和包名的问题。

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

    这里写图片描述

    应用包名:是在APP项目配置文件AndroidManifest.xml中声明的package值。
    应用签名:根据项目的应用包名和编译使用的keystore,可由签名工具生成一个32位的md5串,在调试的手机上安装签名工具后,运行可生成应用签名串,如图所示,绿色串即应用签名。签名工具下载地址https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk,下载到手机上运行(该手机上必须要有你正式打包签名的那个apk),如下图;

    这里写图片描述
    然后把该值填写到微信开放平台里的应用签名那里。

    还有一种获取签名的方法;
    在Studio工具里面开发的话,在Terminal 窗口里面输入命令 keytool -v -list -keystore keystore.jks(keystore.jks是你签名的时候生成的文件,写上你自己文件的名字),运行即可看到。MD5;…一大串数……这样的一串,这就是签名。;
    在eclipse工具里面开发的话。打包的时候会看到的。MD5;…一大串数……(去掉里面的冒号,大写改成小写的填到微信开放平台里的应用签名那里)

    一。配置文件Androidmanifest

            <activity
                android:name=".teacher.ui.PayActivity"
                android:label="@string/app_name"
                android:exported="true"
                android:launchMode="singleTop">
                <intent-filter>
                    <action android:name="android.intent.action.VIEW"/>
                    <category android:name="android.intent.category.DEFAULT"/>
                    <data android:scheme="wx690b9cf56a4ec056"/> //写入你的appid
                </intent-filter>
            </activity>

    二。调起微信支付

    PayActivity里面
    在onCreate里面初始化IWXAPI

        public static final String APP_ID = "wx690b9cf56a4ec056";
        private IWXAPI api;
    
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_affirm_order);
            api = WXAPIFactory.createWXAPI(AffirmOrderActivity.this, APP_ID, true);
            api.registerApp(APP_ID);
        }

    发起支付代码
    你没有看错,就只有这么点代码,里面需要的值你们自己的后台会返回的,拿过来塞到里面就好

                PayReq req = new PayReq();
                req.appId = APP_ID;
                req.partnerId = "";
                req.prepayId = "";
                req.packageValue = "";
                req.nonceStr = "";
                req.timeStamp = "";
                req.sign = "";
                api.sendReq(req);
                //以上代码就是发起微信支付的方法

    三。支付结果的处理

    这里面分为两步
    1,微信提供的支付结果的类叫WXPayEntryActivity,
       微信开放平台有个 不成文的规定(文档里没有说明),就是回调的Activity必须是:你的包名+.wxapi.WXPayEntryActivity.java
    

    如下;

    public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{
    
    
        private IWXAPI api;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            TextView tv = new TextView(this);
            tv.setText("支付结果");
            setContentView(tv);
            api = WXAPIFactory.createWXAPI(this, AffirmOrderActivity.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) {
    
            if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setTitle("提示");
                builder.setMessage(getString(R.string.pay_result_callback_msg,                                             String.valueOf(resp.errCode)));
                builder.show();
            }
        }
    }
    //回调中errCode值
    // 0    成功  展示成功页面
    //-1    错误  可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
    //-2    用户取消    无需处理。发生场景:用户不支付了,点击取消,返回APP。
    2,在配置文件Androidmanifest注册WXPayEntryActivity 
    
       <activity
                android:name="(你的包名).wxapi.WXPayEntryActivity"
                android:exported="true"//这一句一定不能少
                android:launchMode="singleTop" />

    至此app端的微信就搞定了,当然还有后台去回调,但是和app没关系。

    欢迎入群一起学习 QQ群 548629089

  • 相关阅读:
    jsp文件中charset和pageEncoding的区别
    如果jsp表单元素的值为空,如何避免null出现在页面上?
    C# 未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序。
    正则表达式
    事件委托与键盘事件
    事件对象的兼容性
    作用域解析题
    事件冒泡与事件铺获的解析
    浏览器内核
    js中级总结
  • 原文地址:https://www.cnblogs.com/jpfss/p/9888046.html
Copyright © 2020-2023  润新知