android 微信支付V3集成 null;code=-1

移动开发 码拜 9年前 (2015-08-12) 1900次浏览

下面是官方demo中的主acrivity,运行后先后点击“生成支付订单-生成APP微信支付参数-调起微信支付”  就是提示:

微信支付结果:null;code=-1;

在哪里设置商品名称和价格呢?怎么就支付了呢?

                    

                    package com.ldkj.yaodian.customer;
                    

                    

                    import java.io.*;
                    

                    import java.net.Inet4Address;
                    

                    import java.net.InetAddress;
                    

                    import java.net.NetworkInterface;
                    

                    import java.util.*;
                    

                    

                    import android.util.Xml;
                    

                    import android.widget.TextView;
                    

                    import org.apache.http.NameValuePair;
                    

                    import org.apache.http.message.BasicNameValuePair;
                    

                    

                    import android.app.Activity;
                    

                    import android.app.ProgressDialog;
                    

                    import android.os.AsyncTask;
                    

                    import android.os.Bundle;
                    

                    import android.util.Log;
                    

                    import android.view.View;
                    

                    import android.widget.Button;
                    

                    

                    

                    import com.tencent.mm.sdk.modelpay.PayReq;
                    

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

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

                    

                    import org.xmlpull.v1.XmlPullParser;
                    

                    

                    /**
                    

                     * 微信支付
                    

                     * @author 孟祥程
                    

                     *
                    

                     */
                    

                    

                    public class PayActivity extends Activity {
                    

                    

                    private static final String TAG = "MicroMsg.SDKSample.PayActivity";
                    

                    

                    PayReq req;
                    

                    final IWXAPI msgApi = WXAPIFactory.createWXAPI(this, null);
                    

                    TextView show;
                    

                    Map<String,String> resultunifiedorder;
                    

                    StringBuffer sb;
                    

                    @Override
                    

                    protected void onCreate(Bundle savedInstanceState) {
                    

                    super.onCreate(savedInstanceState);
                    

                    setContentView(R.layout.pay);
                    

                    show =(TextView)findViewById(R.id.editText_prepay_id);
                    

                    req = new PayReq();
                    

                    sb=new StringBuffer();
                    

                    

                    msgApi.registerApp(Constants.APP_ID);
                    

                    //生成prepay_id
                    

                    Button payBtn = (Button) findViewById(R.id.unifiedorder_btn);
                    

                    payBtn.setOnClickListener(new View.OnClickListener() {
                    

                    @Override
                    

                    public void onClick(View v) {
                    

                    GetPrepayIdTask getPrepayId = new GetPrepayIdTask();
                    

                    getPrepayId.execute();
                    

                    }
                    

                    });
                    

                    Button appayBtn = (Button) findViewById(R.id.appay_btn);
                    

                    appayBtn.setOnClickListener(new View.OnClickListener() {
                    

                    

                    @Override
                    

                    public void onClick(View v) {
                    

                    sendPayReq();
                    

                    }
                    

                    });
                    

                    

                    //生成签名参数
                    

                    Button appay_pre_btn = (Button) findViewById(R.id.appay_pre_btn);
                    

                    appay_pre_btn.setOnClickListener(new View.OnClickListener() {
                    

                    

                    @Override
                    

                    public void onClick(View v) {
                    

                    genPayReq();
                    

                    }
                    

                    });
                    

                    }
                    

                    

                    

                    

                    /**
                    

                     生成签名
                    

                     */
                    

                    

                    private String genPackageSign(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);
                    

                    

                    

                    String packageSign = MD5.getMessageDigest(sb.toString().getBytes()).toUpperCase();
                    

                    Log.e("orion",packageSign);
                    

                    return packageSign;
                    

                    }
                    

                    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());
                    

                    Log.e("orion",appSign);
                    

                    return appSign;
                    

                    }
                    

                    private String toXml(List<NameValuePair> params) {
                    

                    StringBuilder sb = new StringBuilder();
                    

                    sb.append("<xml>");
                    

                    for (int i = 0; i < params.size(); i++) {
                    

                    sb.append("<"+params.get(i).getName()+">");
                    

                    

                    

                    sb.append(params.get(i).getValue());
                    

                    sb.append("</"+params.get(i).getName()+">");
                    

                    }
                    

                    sb.append("</xml>");
                    

                    

                    Log.e("orion",sb.toString());
                    

                    return sb.toString();
                    

                    }
                    

                    

                    private class GetPrepayIdTask extends AsyncTask<Void, Void, Map<String,String>> {
                    

                    

                    private ProgressDialog dialog;
                    

                    

                    

                    @Override
                    

                    protected void onPreExecute() {
                    

                    dialog = ProgressDialog.show(PayActivity.this, getString(R.string.app_tip), getString(R.string.getting_prepayid));
                    

                    }
                    

                    

                    @Override
                    

                    protected void onPostExecute(Map<String,String> result) {
                    

                    if (dialog != null) {
                    

                    dialog.dismiss();
                    

                    }
                    

                    sb.append("prepay_id\n"+result.get("prepay_id")+"\n\n");
                    

                    show.setText(sb.toString());
                    

                    

                    resultunifiedorder=result;
                    

                    

                    }
                    

                    

                    @Override
                    

                    protected void onCancelled() {
                    

                    super.onCancelled();
                    

                    }
                    

                    

                    @Override
                    

                    protected Map<String,String>  doInBackground(Void... params) {
                    

                    

                    String url = String.format("https://api.mch.weixin.qq.com/pay/unifiedorder");
                    

                    String entity = genProductArgs();
                    

                    

                    Log.e("orion",entity);
                    

                    

                    byte[] buf = Util.httpPost(url, entity);
                    

                    

                    String content = new String(buf);
                    

                    Log.e("orion", content);
                    

                    Map<String,String> xml=decodeXml(content);
                    

                    

                    return xml;
                    

                    }
                    

                    }
                    

                    

                    

                    

                    public Map<String,String> decodeXml(String content) {
                    

                    

                    try {
                    

                    Map<String, String> xml = new HashMap<String, String>();
                    

                    XmlPullParser parser = Xml.newPullParser();
                    

                    parser.setInput(new StringReader(content));
                    

                    int event = parser.getEventType();
                    

                    while (event != XmlPullParser.END_DOCUMENT) {
                    

                    

                    String nodeName=parser.getName();
                    

                    switch (event) {
                    

                    case XmlPullParser.START_DOCUMENT:
                    

                    

                    break;
                    

                    case XmlPullParser.START_TAG:
                    

                    

                    if("xml".equals(nodeName)==false){
                    

                    //实例化student对象
                    

                    xml.put(nodeName,parser.nextText());
                    

                    }
                    

                    break;
                    

                    case XmlPullParser.END_TAG:
                    

                    break;
                    

                    }
                    

                    event = parser.next();
                    

                    }
                    

                    

                    return xml;
                    

                    } catch (Exception e) {
                    

                    Log.e("orion",e.toString());
                    

                    }
                    

                    return null;
                    

                    

                    }
                    

                    

                    

                    private String genNonceStr() {
                    

                    Random random = new Random();
                    

                    return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());
                    

                    }
                    

                    

                    private long genTimeStamp() {
                    

                    return System.currentTimeMillis() / 1000;
                    

                    }
                    

                    

                    

                    

                    private String genOutTradNo() {
                    

                    Random random = new Random();
                    

                    return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());
                    

                    }
                    

                    

                    

                       //
                    

                    private String genProductArgs() {
                    

                    StringBuffer xml = new StringBuffer();
                    

                    

                    try {
                    

                    String nonceStr = genNonceStr();
                    

                    

                    

                    xml.append("</xml>");
                    

                               List<NameValuePair> packageParams = new LinkedList<NameValuePair>();
                    

                    packageParams.add(new BasicNameValuePair("appid", Constants.APP_ID));
                    

                    packageParams.add(new BasicNameValuePair("body", "APP pay test"));
                    

                    packageParams.add(new BasicNameValuePair("mch_id", Constants.MCH_ID));
                    

                    packageParams.add(new BasicNameValuePair("nonce_str", nonceStr));
                    

                    packageParams.add(new BasicNameValuePair("notify_url", "http://shenghuomofang.com"));
                    

                    packageParams.add(new BasicNameValuePair("out_trade_no",genOutTradNo()));
                    

                    packageParams.add(new BasicNameValuePair("spbill_create_ip",getPhoneIp()));
                    

                    packageParams.add(new BasicNameValuePair("total_fee", "1"));
                    

                    packageParams.add(new BasicNameValuePair("trade_type", "APP"));
                    

                    

                    

                    String sign = genPackageSign(packageParams);
                    

                    packageParams.add(new BasicNameValuePair("sign", sign));
                    

                    

                    

                       String xmlstring =toXml(packageParams);
                    

                       //解决body传中文报签名错误的问题,生成的xml请求参数转为字节数组后,用“ISO8859-1”编码格式进行编码为字符
                    

                    return new String(xmlstring.getBytes(),"ISO8859-1");
                    

                    

                    } catch (Exception e) {
                    

                    Log.e(TAG, "genProductArgs fail, ex = " + e.getMessage());
                    

                    return null;
                    

                    }
                    

                    

                    

                    }
                    

                    private void genPayReq() {
                    

                    

                    req.appId = Constants.APP_ID;
                    

                    req.partnerId = Constants.MCH_ID;
                    

                    req.prepayId = resultunifiedorder.get("prepay_id");
                    

                    req.packageValue = "prepay_id="+resultunifiedorder.get("prepay_id");
                    

                    req.nonceStr = genNonceStr();
                    

                    req.timeStamp = String.valueOf(genTimeStamp());
                    

                    

                    

                    List<NameValuePair> signParams = new LinkedList<NameValuePair>();
                    

                    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");
                    

                    

                    show.setText(sb.toString());
                    

                    

                    Log.e("orion", signParams.toString());
                    

                    

                    }
                    

                    private void sendPayReq() {
                    

                    

                    

                    msgApi.registerApp(Constants.APP_ID);
                    

                    msgApi.sendReq(req);
                    

                    }
                    

                    

                    public static String getPhoneIp() { 
                    

                        try { 
                    

                            for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { 
                    

                                NetworkInterface intf = en.nextElement(); 
                    

                                for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { 
                    

                                    InetAddress inetAddress = enumIpAddr.nextElement(); 
                    

                                    if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) { 
                    

                                        // if (!inetAddress.isLoopbackAddress() && inetAddress 
                    

                                        // instanceof Inet6Address) { 
                    

                                        return inetAddress.getHostAddress().toString(); 
                    

                                    } 
                    

                                } 
                    

                            } 
                    

                        } catch (Exception e) { 
                    

                        } 
                    

                        return "127.0.0.1"; 
                    

                    }
                    

                    

                    

                    

                    

                    }
                    

                    

                    

#2

20分

            packageParams.add(new BasicNameValuePair(“total_fee”, “1”));

这句代码里,默认支付金额为1分。

#3

20分

商品名称和价格需要你在界面里自己做。
#4

10分

packageParams.add(new BasicNameValuePair(“body”, “APP pay test”));

——————————

这里写商品名称

#5
这个demo不行啊,替换了appid那些东西还是返回-1,楼主遇到了这样的情况吗?

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明android 微信支付V3集成 null;code=-1
喜欢 (0)
[1034331897@qq.com]
分享 (0)