Android微信支付完全解析,权威版

为什么我敢说是权威版呢?

我在网上查阅了大量资料,他们给出的方案都不是最安全的做法,所有的操作都是放在客户端,而官方推荐的做法是放在服务器,支付成败结果应该由服务器来同步完成,而我的方案是经过重重考验而后得出来的。

Android集成微信支付
微信支付和支付宝支付一样的,都可以在客户端发起支付并成功通过,但这样做的漏洞比较大,所以一定不要通过客户端直接来完成

1.首先需要 在客户端向服务器发起一个微信预支付操作:

请求参数如下:

body.put("loginUserId", loginUserId );
body.put("title", title);
body.put("business", business);
body.put("orderId", orderId);
body.put("charges", charges); //  注意这里的金额是要在实际金额*100
body.put("employeeId", employeeId);
body.put("WXAppId", Const.WX_APP_ID);

微信预支付操作处理后可以从微信服务器获取一个预支付id,然后再通过预支付id真正发起微信支付操作.

 WXPayUtil payUtil = new WXPayUtil(mActivity);
 payUtil.doPayReq(bean.prepay_id);

具体代码放一下,反正也没有什么机密

public class WXPayUtil {
   private PayReq req = null;
   private IWXAPI msgApi = null;
   private StringBuffer sb = null;


   public WXPayUtil(final Activity activity) {
       this.req = new PayReq();
       this.msgApi = WXAPIFactory.createWXAPI(activity, null);
       this.msgApi.registerApp(Constants.APP_ID);
       this.sb = new StringBuffer();
   }


   /**
    * @work:生成签名参数
    * @date:2015-9-7 上午11:48:04
    * @author:hg_liuzl@163.com
    * @params:
    */
   public void doPayReq(String prePayId) {
       req.appId = Constants.APP_ID;
       req.partnerId = Constants.MCH_ID;
       req.prepayId = prePayId;
       req.packageValue = "Sign=WXPay";
       req.nonceStr = genNonceStr();
       req.timeStamp = String.valueOf(genTimeStamp());
       List<NameValuePair> signParams = new LinkedList<>();
       signParams.add(new BasicNameValuePair("appid", req.appId));
       signParams.add(new BasicNameValuePair("noncestr", req.nonceStr));
       signParams.add(new BasicNameValuePair("package", req.packageValue));
       signParams.add(new BasicNameValuePair("partnerid", req.partnerId));
       signParams.add(new BasicNameValuePair("prepayid", req.prepayId));
       signParams.add(new BasicNameValuePair("timestamp", req.timeStamp));
       req.sign = genAppSign(signParams);
       sb.append("sign\n" + req.sign + "\n\n");
       sendPayReq();
   }

   /**
    * @work:启动支付
    * @date:2015-9-7 上午11:49:51
    * @author:hg_liuzl@163.com
    */
   private void sendPayReq() {
       msgApi.registerApp(Constants.APP_ID);
       msgApi.sendReq(req);
   }

   private String genAppSign(List<NameValuePair> params) {
       StringBuilder sb = new StringBuilder();
       for (int i = 0; i < params.size(); i++) {
           sb.append(params.get(i).getName());
           sb.append('=');
           sb.append(params.get(i).getValue());
           sb.append('&');
       }
       sb.append("key=");
       sb.append(Constants.API_KEY);

       this.sb.append("sign str\n" + sb.toString() + "\n\n");
       String appSign = MD5.getMessageDigest(sb.toString().getBytes()).toUpperCase();
       return appSign;
   }

   private String genNonceStr() {
       Random random = new Random();
       return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());
   }

   private long genTimeStamp() {
       return System.currentTimeMillis() / 1000;
   }

然后微信的操作如下:

public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{
    
    /***微信支付结果*/
    public static int mWXPayResult = -1;

    private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";
    
    private IWXAPI api;
    
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.pay_result);
        
        api = WXAPIFactory.createWXAPI(this, Constants.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) {
            
            mWXPayResult = resp.errCode;
            
            if (resp.errCode == 0) //支付成功,
            {   
                BToast.show(this, "支付成功!");
                finish();
            } else if(resp.errCode == -1) { //支付失败
                BToast.show(this, "支付错误");
                finish();
            }else if(resp.errCode == -2){//取消支付
                BToast.show(this, "您已经取消了支付!");
                finish();
            }
        }
    }
}

这里我有一个全局静态变量mWXPayResult来标记微信支付是否成功的状态.

  mPayBean.payResult = WXPayEntryActivity.mWXPayResult == 0;
                if (mPayBean.payResult) {
                    doSubmit();
                } 

这个时候微信支付就处理完毕.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容

  • 一、背景介绍 作为一名Android开发,从最初的跌跌撞撞到现在小有所悟,这其中经历过的辛酸苦辣也是一种痛并快乐着...
    freecats08阅读 4,814评论 7 54
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,488评论 25 707
  • 支付 1.支付宝和银联的支付流程 常用的支付方式有: 1、支付宝支付 https://openhome.alipa...
    丶逐渐阅读 1,671评论 3 11
  • 《非银行支付机构网络支付业务管理办法》条款释义 - 中国支付网 - 中国支付行业第一门户网站2016年7月1日...
    菜菜苔阅读 7,503评论 1 44
  • 前几天县城的乳江河上游关了闸,整条河河水干涸,很多人卷起裤角在河里摸螺,电鱼。那天正好经过,远远望去,似乎电了好多...
    心向阳无悲伤阅读 532评论 5 6