• Android微信支付SDK


    App对接微信调起微信支付需要在微信平台注册,鉴别的标识就是App的包名,所以将申请的包名单独打包成一个Apk文件,则在其他的App调起此Apk的时候同样可以起到调用微信支付的功能。这样就实现了调起微信支付的SDk的功效。操作实现中要将Apk文件安放在assets文件夹的目录下。

    当安装好App之后,要将Apk文件保存到本地中

    代码实现如下:

    private boolean saveApk() throws Exception {
            /** 首先默认个文件保存路径 */
            sdcard = Environment.getExternalStorageState().equalsIgnoreCase(
                    Environment.MEDIA_MOUNTED) ? Environment
                    .getExternalStorageDirectory().getAbsolutePath()
                    : "/mnt/sdcard";// 保存到SD卡
            apk_path = sdcard + "/paytend_wx/saveApk";// 保存的确切位置
            return copyApkFromAssets(mContext, "paytendSafe2Pay.apk", apk_path);
    
        }
    
    private boolean copyApkFromAssets(Context context, String fileName,
                String path) {
            boolean copyIsFinish = false;
            try {
                File foder = new File(apk_path);
                if (!foder.exists()) {
                    foder.mkdirs();
                }
                File myCaptureFile = new File(apk_path, fileName);
                if (!myCaptureFile.exists()) {
                    myCaptureFile.createNewFile();
                }
                InputStream is = context.getAssets().open(fileName);
                FileOutputStream fos = new FileOutputStream(myCaptureFile);
                byte[] temp = new byte[1024];
                int i = 0;
                while ((i = is.read(temp)) > 0) {
                    fos.write(temp, 0, i);
                }
                fos.close();
                is.close();
                copyIsFinish = true;
            } catch (IOException e) {
                return false;
            }
            return copyIsFinish;
        }

    如果Apk已经安装保存到指定的位置,接下来就是调起安装界面将Apk安装到手机中

    代码如下:

    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.setDataAndType(
    Uri.parse("file://" + apk_path
    + "/paytendSafe2Pay.apk"),
    "application/vnd.android.package-archive");
    mContext.startActivity(intent);

    调起微信需要传一些参数,考虑到参数的安全性,最终的参数需要从后台请求获得。

    参数的后台请求工作放在了Apk文件中。

    在App端调用jar中的方法传参给Apk文件:

        public Map<String, Object> CreatParameters() {
            //由商户生成的订单号
            out_trade_no = System.currentTimeMillis() + "";
            //分配给商户id
            merchantId = Constants.MC_ID;
            // 需要支付的金额,单位是分
            total_fee = "1";
            //商户后台支付状态需要调用的接口
            sub_mch_notify_url = "http://test.paytend.com:7000/paytend_wxpay_demo/notify.jsp";
            // 商品的名字
            body = "青龙偃月刀";
            // 随机字符串
            nonce_str = getRandomStr(20);
            mMap = new HashMap<String, Object>();
            mMap.put("out_trade_no", out_trade_no);
            mMap.put("merchantId", merchantId);
            mMap.put("total_fee", total_fee);
            mMap.put("sub_mch_notify_url", sub_mch_notify_url);
            mMap.put("body", body);
            mMap.put("nonce_str", nonce_str);
            // 签名
            sign = getCommonSign(mMap, Constants.API_KEY);
            mMap.put("sign", sign);
            return mMap;
        }

    之所以将调起Apk的方法封装成jar文件,就是保证Apk的包名和Apk支付界面名的不泄露。在Apk中向后台发送请求,获取参数,调起微信支付。

    当微信支付成功后,Apk退出(Apk是没有界面的)发送广播通知App交易状况。

    总结流程如下:

    点击App上的微信支付按钮,App传一些固定参数到jar文件中,jar文件调起支付的Apk,并将这些参数传递给支付的Apk,支付的Apk向后台请求获取支付的参数,将这些参数传递给微信的jar文件,通过微信jar文件中的方法调起微信支付。

    当微信支付成功后,Apk退出(Apk是没有界面的)发送广播通知App交易状况。

    写的比较乱,权当备忘了。

  • 相关阅读:
    动态调整iframe的高度
    Binary Tree Zigzag Level Order Traversal
    Leetcode Anagrams
    二叉树层次遍历串成单链表
    leetcode 4sum
    leetcode 二叉树系列
    编程之美2.3
    Decode Ways
    leetcode graycode
    leetcode editdistance
  • 原文地址:https://www.cnblogs.com/ruichenblogs/p/6479952.html
Copyright © 2020-2023  润新知