android微信支付测试遇到的坑,得不到prepay_id

特别注意:spill_create_ip一定要是测试手机的ip,在设置----关于手机----版本信息里面找到ip;

//PayActivity的代码

package com.example.administrator.demopaywx;


import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.mm.sdk.openapi.WXAPIFactory;

import java.util.Locale;

public class PayActivity extends Activity {

   private IWXAPI api;
   Button appayBtn;
   //随机字符串
   static String nonce_str;
   //通知地址
   static String notify_url;
   //商户订单号
   static String out_trade_no;
   //客户端ipv4地址(必须是本机的ip地址)
   String spbill_create_ip = "192.168.2.170";
   //发送的xml字符串
   String entity;
   //商品描述
   String body;
   //事件戳
   String timestamp;
   //总金额(单位分)
   int total_fee;
   //第一次签名
   static String sign;
   //微信统一下单接口
   final String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.pay);
      api = WXAPIFactory.createWXAPI(this, Constants.APP_ID);
      api.registerApp(Constants.APP_ID);
      initReq();
      initView();
   }
   private void initReq() {
      body = "iphone";
      nonce_str = ResourceUtil.createRandomString(32);
      Log.e("==========","======nonce_str======"+nonce_str+"     length="+nonce_str.length());
      notify_url = "http://www.weixin.qq.com/wxpay/pay.php";
      out_trade_no = ResourceUtil.generateOutTradeNo(32);
      Log.e("================","=======out_trade_no========="+out_trade_no+"     length="+out_trade_no.length());
      total_fee = 1;
      timestamp = getTimeStamp();
      Log.e("==============","=====timestamp======"+timestamp+"     length="+timestamp.length());
      String A = "appid=" + Constants.APP_ID +
            "&body=" + body +
            "&mch_id=" + Constants.MCH_ID +
            "&nonce_str=" + nonce_str +
            "&notify_url=" + notify_url +
            "&out_trade_no=" + out_trade_no +
            "&spbill_create_ip=" +spbill_create_ip+
            "&total_fee=" + total_fee +
            "&trade_type=APP" +
            "&key=" + Constants.APP_KEY;
      sign = MD5.getMessageDigest(A.getBytes()).toUpperCase(Locale.getDefault());
      Log.e("===========","=======signsign====="+sign+"     length="+sign.length());
//          参数以xml格式传递
      entity = "<xml>" +
            "<appid>wx78d09351c6c8ec4e</appid>" +
            "<body>" + body + "</body>" +
            "<mch_id>" + Constants.MCH_ID + "</mch_id>" +
            "<nonce_str>" + nonce_str + "</nonce_str>" +
            "<out_trade_no>" + out_trade_no + "</out_trade_no>" +
            "<spbill_create_ip>" + spbill_create_ip + "</spbill_create_ip>" +
            "<total_fee>" + total_fee + "</total_fee>" +
            "<notify_url>" + notify_url + "</notify_url>" +
            "<trade_type>APP</trade_type>" +
            "<sign>" + sign + "</sign>" +
            "</xml>";
   }

   private String getTimeStamp() {
      return String.valueOf(System.currentTimeMillis() / 1000);
   }

   private void initView(){
      TextView tv_thing;
      TextView tv_money;
      TextView tv_from;
      tv_thing = (TextView) findViewById(R.id.pay_thing);
      tv_from = (TextView) findViewById(R.id.pay_from);
      tv_money = (TextView) findViewById(R.id.pay_money);
      tv_thing.setText("商品:"+body);
      tv_money.setText("总金额:"+total_fee+"");
      tv_from.setText("商户"+Constants.MCH_ID);
      appayBtn = (Button) findViewById(R.id.appay_btn);
      appayBtn.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
            appayBtn.setEnabled(false);
            Toast.makeText(PayActivity.this, "获取订单中......", Toast.LENGTH_SHORT).show();
            Log.e("==============","==========entity===="+entity);
            new GetPrepayIdTask(api).execute(url,entity);
         }
      });
   }
}

//异步任务进行网络请求,想微信统一下单接口传递XML字符串,获得byte[ ] 数组,转化成字符串,获得xml字符串,解析获得prepay_id值,基本就达到目的了

package com.example.administrator.demopaywx;

import android.os.AsyncTask;
import android.util.Log;
import com.tencent.mm.sdk.modelpay.PayReq;
import com.tencent.mm.sdk.openapi.IWXAPI;
import java.util.Locale;

/**
 * Created by Administrator on 2016/12/13.
 */

public class GetPrepayIdTask extends AsyncTask<String,Void,OrderResult> {


    public static final String TAG = "GetPrepayIdTask";
    private IWXAPI api;

    public GetPrepayIdTask(IWXAPI api) {
        this.api = api;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected OrderResult doInBackground(String... strings) {
        Log.e("============","=========doInBackground============");
        OrderResult result;
        String url = String.format(strings[0]);
        byte[] buf = Util.httpPost(url,strings[1]);
        String content =  new String(buf);
        Log.e("========","=========content========="+content);
        result = DecodeXmlUtil.decodeXML(content);
        return result;
    }

    @Override
    protected void onPostExecute(OrderResult orderResult) {
        sendPayReq(orderResult);
    }

    private void sendPayReq(OrderResult result) {
        String prepare_id = result.getPrepayId();
        Log.e("============","=====result====="+result.toString());
        Log.e("==========","========prepare_id==========="+prepare_id);
        Log.d(TAG, "sendPayReq, prepare_id = " + prepare_id + ", sign = " + result.getSign());

        if (prepare_id == null || prepare_id.length() == 0) {
            Log.e("==========","======================================");
            Log.e(TAG, "sendPayReq fail, prepare_id is empty");
        }

//        result = orderResult;
        PayReq req = new PayReq();
        req.appId = result.getAppId();
        req.nonceStr = result.getNonceStr();//随机字符串
        req.partnerId = result.getMchId();//商户号
        req.prepayId = result.getPrepayId();
        req.timeStamp = getTimeStamp();//时间戳
        req.packageValue = "Sign=WXPay";//固定字符串
        req.sign = SignUtil.signByMD5("appid=" + Constants.APP_ID +
                "&noncestr=" + req.nonceStr +
                "&package=Sign=WXPay" +
                "&partnerid=" + req.partnerId +
                "&prepayid=" + req.prepayId +
                "&timestamp=" + req.timeStamp +
                "&key=" + Constants.APP_KEY).toUpperCase(Locale.getDefault());//签名

        // 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
        api.sendReq(req);
    }

    private String getTimeStamp() {
        return String.valueOf(System.currentTimeMillis() / 1000);
    }

    private static OrderResult orderResult = new OrderResult(
            "success","success","001","0","012adfjmgoaalmaoisja3456",
            Constants.APP_ID,Constants.MCH_ID,PayActivity.sign,"APP",PayActivity.nonce_str);

}
//一下是转载的签名算法以及xml解析方法

package com.example.administrator.demopaywx;

import android.util.Log;
import android.util.Xml;

import org.xmlpull.v1.XmlPullParser;

import java.io.StringReader;

/**
 * Created by Administrator on 2016/12/13.
 */

public class DecodeXmlUtil {
    public static OrderResult decodeXML(String content) {
        XmlPullParser parser = Xml.newPullParser();
        OrderResult bean = new OrderResult();
        try {
            parser.setInput(new StringReader(content));
            int event = parser.getEventType();
            while (event != XmlPullParser.END_DOCUMENT) {
                switch (event) {
                    case XmlPullParser.START_DOCUMENT:
                        break;
                    case XmlPullParser.START_TAG:
                        if ("return_code".equals(parser.getName())) {
                            parser.next();
                            bean.setReturnCode(parser.getText().toString());
                        } else if ("return_msg".equals(parser.getName())) {
                            parser.next();
                            bean.setReturnMsg(parser.getText().toString());
                        }else if ("appid".equals(parser.getName())) {
                            parser.next();
                            bean.setAppId(parser.getText().toString());
                           Log.e("=========","======parser.getText()=="+parser.getText());
                        }else if ("mch_id".equals(parser.getName())) {
                            parser.next();
                            bean.setMchId(parser.getText().toString());
                           Log.e("=========","======setMchId=="+parser.getText());
                        }else if ("nonce_str".equals(parser.getName())) {
                            parser.next();
                            bean.setNonceStr(parser.getText().toString());
                           Log.e("=========","======etNonceSt=="+parser.getText());
                        }else if ("sign".equals(parser.getName())) {
                            parser.next();
                            bean.setSign(parser.getText().toString());
                           Log.e("=========","======setSign=="+parser.getText());
                        }else if ("result_code".equals(parser.getName())) {
                            parser.next();
                            bean.setResultCode(parser.getText().toString());
                           Log.e("=========","======setResultCode=="+parser.getText());
                        }else if ("prepay_id".equals(parser.getName())) {
                            parser.next();
                            bean.setPrepayId(parser.getText().toString());
                           Log.e("=========","======setPrepayId=="+parser.getText());
                        }else if ("trade_type".equals(parser.getName())) {
                            parser.next();
                            bean.setTradeType(parser.getText().toString());
                           Log.e("=========","======parser.setTradeType()=="+parser.getText());
                        }
                        break;
                    case XmlPullParser.END_TAG:
                        break;
                }
                event = parser.next();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bean;
    }
}


package com.example.administrator.demopaywx;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * Created by Administrator on 2016/12/11.
 */

public class SignUtil {
    public static String signByMD5(String source) {
        byte[] bytes = null;
        try {
            MessageDigest digest = MessageDigest.getInstance("MD5");
            digest.update(source.getBytes());  //更新摘要

            bytes = digest.digest(); //再通过执行诸如填充之类的最终操作完成哈希计算。在调用此方法之后,摘要被重置。
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }

        StringBuilder builder = new StringBuilder(bytes.length * 2);
        for (byte b : bytes) {
            /**
             * 0xFF默认是整形,一个byte跟0xFF相与会先将那个byte转化成整形运算
             */
            if ((b & 0xFF) < 0x10) {  //如果为1位 前面补个0
                builder.append("0");
            }

            builder.append(Integer.toHexString(b & 0xFF));
        }

        return builder.toString();
    }
}


//保存所有信息的自定义类

package com.example.administrator.demopaywx;

/**
 * Created by Administrator on 2016/12/11.
 */

public class OrderResult {
    public OrderResult(String returnCode, String returnMsg, String resultCode, String errorDesc, String prepayId, String appId, String mchId, String sign, String tradeType, String nonceStr) {
        this.returnCode = returnCode;
        this.returnMsg = returnMsg;
        this.resultCode = resultCode;
        this.errorDesc = errorDesc;
        this.prepayId = prepayId;
        this.appId = appId;
        this.mchId = mchId;
        this.sign = sign;
        this.tradeType = tradeType;
        this.nonceStr = nonceStr;
    }

    public OrderResult() {
    }

    public String getReturnCode() {
        return returnCode;
    }

    public void setReturnCode(String returnCode) {
        this.returnCode = returnCode;
    }

    public String getReturnMsg() {
        return returnMsg;
    }

    public void setReturnMsg(String returnMsg) {
        this.returnMsg = returnMsg;
    }

    public String getResultCode() {
        return resultCode;
    }

    public void setResultCode(String resultCode) {
        this.resultCode = resultCode;
    }

    public String getErrorDesc() {
        return errorDesc;
    }

    public void setErrorDesc(String errorDesc) {
        this.errorDesc = errorDesc;
    }

    public String getPrepayId() {
        return prepayId;
    }

    public void setPrepayId(String prepareId) {
        this.prepayId = prepareId;
    }

    @Override
    public String toString() {
        return "OrderResult{" +
                "returnCode='" + returnCode + '\'' +
                ", returnMsg='" + returnMsg + '\'' +
                ", resultCode='" + resultCode + '\'' +
                ", errorDesc='" + errorDesc + '\'' +
                ", prepayId='" + prepayId + '\'' +
                ", appId='" + appId + '\'' +
                ", mchId='" + mchId + '\'' +
                ", sign='" + sign + '\'' +
                ", tradeType='" + tradeType + '\'' +
                ", nonceStr='" + nonceStr + '\'' +
                '}';
    }

    String returnCode;
    String returnMsg;
    String resultCode;
    String errorDesc;
    String prepayId;
    String appId;
    String mchId;
    String sign;
    String tradeType;
    String nonceStr;

    public String getAppId() {
        return appId;
    }

    public void setAppId(String appId) {
        this.appId = appId;
    }

    public String getMchId() {
        return mchId;
    }

    public void setMchId(String mchId) {
        this.mchId = mchId;
    }

    public String getSign() {
        return sign;
    }

    public void setSign(String sign) {
        this.sign = sign;
    }

    public String getTradeType() {
        return tradeType;
    }

    public void setTradeType(String tradeType) {
        this.tradeType = tradeType;
    }

    public String getNonceStr() {
        return nonceStr;
    }

    public void setNonceStr(String nonceStr) {
        this.nonceStr = nonceStr;
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值