Android 集成微信支付

来源:互联网 发布:php是世界上最美的语言 编辑:程序博客网 时间:2024/05/18 20:05

注释:
要继承微信支付和支付宝功能,必须要有以下配置信息,微信支付和支付宝支付申请的秘钥等提供给开发者(当然也可以自己去申请),将配置信息放在静态类中,已被统一使用(安全考虑,微信支付宝推荐这些数据放在服务其中)

public class ParameterConfig {    public static final String  GANHOST = "http://101.226.197.11"; //服务器地址ip(根据自己替换)    /**     * 微信     */   <span style="white-space:pre">   </span> //appid    public static final String WX_APP_ID = "";// 自己填写自己项目的    // 商户号    public static final String WX_MCH_ID = "";// 自己填写自己项目的    // API密钥,在商户平台设置    public static final String WX_API_KEY = "";// 自己填写自己项目的    //服务器回调接口    public static final String WX_notifyUrl = GANHOST+"/service/orderComplete";// 用于微信支付成功的回调(按自己需求填写)    /**     * 支付宝     */    // 商户PID    public static final String PARTNER = "";//自己填写自己项目的    // 商户收款账号    public static final String SELLER = "";//自己填写自己项目的    // 商户私钥,pkcs8格式    public static final String RSA_PRIVATE = "";//自己填写自己项目的    public static final String aliPay_notifyURL = GANHOST+"/service/alipay/orderComplete";//支付宝支付成功的回调 }

1.微信支付集成的前提条件
(1)首先要导入微信.jar包,从开发平台上可以下载到,然后放置在libs文件夹上。
(2)需要配置mainfest

<uses-permission android:name="android.permission.INTERNET"><uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">    </uses-permission></uses-permission></uses-permission>

b.activity配置,这里com.gan.mypay改成自己的包名(如果自己包名与src下的package 名不一样,这里要的是在manifest中配置的名称,同样需要在src建立以自己包 名为路经的package,一定确保有这个activity)这个activity是微信支付结果要回调的activty。

android:name="com.gan.mypay.wxapi.WXPayEntryActivity"android:exported="true"android:launchMode="singleTop"/>

2.代码继承
(1)首先要有一个商品页MainActivity,用来收集商品信息,这里需要后台交互生成订单,我们这里做的一个假的订单。
这里写图片描述
MainActivity.java(这里用了xutils的注入)

@ContentView(R.layout.activity_main)public class MainActivity extends Activity {    private Goods goods;    private String username;    private String mobile;    private String adress;    private int count;    @ViewInject(R.id.product_ordsubmit_username)    private TextView usernameTV;    @ViewInject(R.id.product_ordsubmit_phone)    private TextView phoneTV;    @ViewInject(R.id.product_ordsubmit_adress)    private TextView adressTV;    @ViewInject(R.id.product_ordsubmit_desc)    private TextView descTV;    @ViewInject(R.id.product_ordsubmit_price)    private TextView priceTV;    @ViewInject(R.id.product_ordsubmit_intg)    private TextView intgTV;    @ViewInject(R.id.product_ordsubmit_count1)    private TextView countTV1;    @ViewInject(R.id.product_ordsubmit_count)    private TextView countTV;    @ViewInject(R.id.product_ordsubmit_intgtotal1)    private TextView intgtotal1TV;    @ViewInject(R.id.product_ordsubmit_intgtotal2)    private TextView intgtotal2TV;    @ViewInject(R.id.product_ordsubmit_pricetotal1)    private TextView pricetotal1TV;    @ViewInject(R.id.product_ordsubmit_pricetotal2)    private TextView pricetotal2TV;    @ViewInject(R.id.product_ordsubmit_counttotal)    private TextView counttotalTV;    @ViewInject(R.id.product_ordsubmit_ok)    private Button okBtn;    @ViewInject(R.id.product_ordsubmit_say_et)    private TextView sayEt;    @ViewInject(R.id.product_ordsubmit_img)    private ImageView img;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        ViewUtils.inject(this);        goods = new Goods();        goods.costprice=100;        goods.productid=692356222;        goods.producttypeid=11;        goods.productname="测试商品";        goods.discountprice=0.01;        goods.productdescription="商品描述";        goods.companydesc="测试商户简单描述";        goods.comanyadress="商户地址未知";        goods.companyname="测试商户";        goods.score=1;        goods.status=1;        goods.stock=300;        count=1;        initData();        initView();    }    private void initData() {            username ="客户名称";            mobile = "13800380038";            adress="客户地址";      }    private void initView() {               usernameTV.setText("收货人:"+username);            phoneTV.setText(mobile+"");            adressTV.setText(adress);            descTV.setText(goods.productdescription);            priceTV.setText("¥"+goods.discountprice);            intgTV.setText("积分:"+goods.score);            countTV1.setText("X"+count);            countTV.setText(count+"");            intgtotal1TV.setText("共得到"+count*goods.score+"积分");            intgtotal2TV.setText("积分:"+count*goods.score);            counttotalTV.setText("共"+count+"件");            pricetotal1TV.setText("¥"+Arith.mul(goods.discountprice, count));            pricetotal2TV.setText("¥"+Arith.mul(goods.discountprice, count));            //ImageLoader.getInstance().displayImage(goods.pic1, img);    }    /**     * 增加数量     * @param v     */    @OnClick(R.id.product_ordsubmit_count_add)    public void add(View v) {        count++;        countTV1.setText("X"+count);        countTV.setText(count+"");        intgtotal1TV.setText("共得到"+count*goods.score+"积分");        intgtotal2TV.setText("积分:"+count*goods.score);        counttotalTV.setText("共"+count+"件");        pricetotal1TV.setText("¥"+Arith.mul(goods.discountprice, count));        pricetotal2TV.setText("¥"+Arith.mul(goods.discountprice, count));    }    /**     * 减少数量     * @param v     */    @OnClick(R.id.product_ordsubmit_count_sub)    public void sub(View v) {        if (count>1) {            count--;            countTV1.setText("X"+count);            countTV.setText(count+"");            intgtotal1TV.setText("共得到"+count*goods.score+"积分");            intgtotal2TV.setText("积分:"+count*goods.score);            counttotalTV.setText("共"+count+"件");            pricetotal1TV.setText("¥"+Arith.mul(goods.discountprice, count));            pricetotal2TV.setText("¥"+Arith.mul(goods.discountprice, count));        }    }    /**     * 提交订单     * @param v     */    @OnClick(R.id.product_ordsubmit_ok)    public void submit(View v) {        final OrderInfo orderInfo=new OrderInfo();        orderInfo.userid=13752;        orderInfo.areacode=23;        orderInfo.buildno="10";        orderInfo.roomno="1001";        orderInfo.producttypeid=goods.producttypeid;        orderInfo.productid=goods.productid;        orderInfo.amount=goods.discountprice;//单价        orderInfo.account=count;//数量        orderInfo.totalamount=Arith.mul(goods.discountprice, count);        //double offsetamount;//抵扣金额        orderInfo.score=count*goods.score;        //int assessitem;//评价项        //int assesslevel;//评价级别        //String assesscontent;//评价内容        //long payid=;//支付编号        orderInfo.status=2;//支付状态待付款        orderInfo.type=11;//日用品        orderInfo.usermemo =sayEt.getText().toString();//业主备注        orderInfo.address =adress;        orderInfo.productname =goods.productname;//        orderInfo.desccontext =goods.productdescription;//        orderInfo.outtradeno=System.currentTimeMillis()+""+orderInfo.userid;        orderInfo.merchantid=goods.companyid;        submitorder(orderInfo);    }    /**     * 订单提交成功,进入付款界面     * @param orderInfo      * @return     */    private void submitorder(OrderInfo orderInfo) {        Intent intent=new Intent(this, SelectPayTypeActivity.class);        intent.putExtra("data", orderInfo);        startActivity(intent);    }}

(2)在mainactivty中点击确认按钮调用支付方式选择页面SelectPayTypeActivity,用来发起支付选择。
(3)根据支付方式调用对应工具类微信(WXpayUtil)

public class WXpayUtil {    private IWXAPI api;    private OrderInfo order;    private Context context;    private PayReq req;    private Map<string,string> resultunifiedorder;    private static final String TAG = "ewuye.online.SelectPayTypeActivity";    public WXpayUtil(Context mcontext,OrderInfo order){        //初始化微信支付        this.order=order;        this.context=mcontext;        if (TextUtils.isEmpty(ParameterConfig.WX_APP_ID) || TextUtils.isEmpty(ParameterConfig.WX_MCH_ID) || TextUtils.isEmpty(ParameterConfig.WX_API_KEY)) {            new AlertDialog.Builder(context).setTitle("警告").setMessage("需要配置WX_APP_ID | WX_MCH_ID| WX_API_KEY\n请到ParameterConfig.java里配置")                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {                        public void onClick(DialogInterface dialoginterface, int i) {                            //                            ((Activity)context).finish();                        }                    }).show();            return;        }        api = WXAPIFactory.createWXAPI(context, null);        req = new PayReq();        //生成prepay_id        GetPrepayIdTask getPrepayId = new GetPrepayIdTask();        getPrepayId.execute();    }    /**     * 用于获取     * @author 95     *     */    private class GetPrepayIdTask extends AsyncTask<void, string="">> {        private ProgressDialog dialog;        @Override        protected void onPreExecute() {            dialog = ProgressDialog.show(context, "提示", "正在获取预支付订单...");        }        @Override        protected void onPostExecute(Map<string,string> result) {            if (dialog != null) {                dialog.dismiss();            }            resultunifiedorder=result;            genPayReq();        }        @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 = httpPost(url, entity);            String content = new String(buf);            Log.e("orion", content);            Map<string,string> xml=decodeXml(content);            return xml;        }    }    private void genPayReq() {        req.appId = ParameterConfig.WX_APP_ID;        req.partnerId = ParameterConfig.WX_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);        Log.e("orion", signParams.toString());        sendPayReq();    }    private void sendPayReq() {        api.registerApp(ParameterConfig.WX_APP_ID);        api.sendReq(req);    }    private String genProductArgs() {        StringBuffer xml = new StringBuffer();        try {            String  nonceStr = genNonceStr();            xml.append("");           List<namevaluepair> packageParams = new LinkedList<namevaluepair>();            packageParams.add(new BasicNameValuePair("appid", ParameterConfig.WX_APP_ID));            packageParams.add(new BasicNameValuePair("body", order.productname));            packageParams.add(new BasicNameValuePair("mch_id", ParameterConfig.WX_MCH_ID));            packageParams.add(new BasicNameValuePair("nonce_str", nonceStr));            packageParams.add(new BasicNameValuePair("notify_url", ParameterConfig.WX_notifyUrl));            packageParams.add(new BasicNameValuePair("out_trade_no",genOutTradNo()));            packageParams.add(new BasicNameValuePair("spbill_create_ip","127.0.0.1"));            packageParams.add(new BasicNameValuePair("total_fee", (int)(order.totalamount*100)+""));            packageParams.add(new BasicNameValuePair("trade_type", "APP"));            String sign = genPackageSign(packageParams);            packageParams.add(new BasicNameValuePair("sign", sign));           String xmlstring =toXml(packageParams);           return new String(xmlstring.toString().getBytes(), "ISO8859-1");            //return xmlstring;        } catch (Exception e) {            Log.e(TAG, "genProductArgs fail, ex = " + e.getMessage());            return null;        }    }    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(ParameterConfig.WX_API_KEY);        String appSign = getMessageDigest(sb.toString().getBytes());        Log.e("orion",appSign);        return appSign;    }    private  HttpClient getNewHttpClient() {            try {                KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());                trustStore.load(null, null);                SSLSocketFactory sf = new SSLSocketFactoryEx(trustStore);                sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);                HttpParams params = new BasicHttpParams();                HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);                HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);                SchemeRegistry registry = new SchemeRegistry();                registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));                registry.register(new Scheme("https", sf, 443));                ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);                return new DefaultHttpClient(ccm, params);            } catch (Exception e) {                return new DefaultHttpClient();            }         }    private class SSLSocketFactoryEx extends SSLSocketFactory {              SSLContext sslContext = SSLContext.getInstance("TLS");              public SSLSocketFactoryEx(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {                  super(truststore);                  TrustManager tm = new X509TrustManager() {                      public X509Certificate[] getAcceptedIssuers() {                          return null;                      }                      @Override                public void checkClientTrusted(X509Certificate[] chain, String authType) throws java.security.cert.CertificateException {                }                @Override                public void checkServerTrusted(X509Certificate[] chain, String authType) throws java.security.cert.CertificateException {                }              };                  sslContext.init(null, new TrustManager[] { tm }, null);              }              @Override        public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException {            return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);        }        @Override        public Socket createSocket() throws IOException {            return sslContext.getSocketFactory().createSocket();        }     }      public  byte[] httpPost(String url, String entity) {        if (url == null || url.length() == 0) {            Log.e(TAG, "httpPost, url is null");            return null;        }        HttpClient httpClient = getNewHttpClient();        HttpPost httpPost = new HttpPost(url);        try {            httpPost.setEntity(new StringEntity(entity));            httpPost.setHeader("Accept", "application/json");            httpPost.setHeader("Content-type", "application/json");            HttpResponse resp = httpClient.execute(httpPost);            if (resp.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {                Log.e(TAG, "httpGet fail, status code = " + resp.getStatusLine().getStatusCode());                return null;            }            return EntityUtils.toByteArray(resp.getEntity());        } catch (Exception e) {            Log.e(TAG, "httpPost exception, e = " + e.getMessage());            e.printStackTrace();            return null;        }    }    private String genOutTradNo() {        Random random = new Random();        return getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());    }    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 getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());    }    private long genTimeStamp() {        return System.currentTimeMillis() / 1000;    }    public  String getMessageDigest(byte[] buffer) {        char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };        try {            MessageDigest mdTemp = MessageDigest.getInstance("MD5");            mdTemp.update(buffer);            byte[] md = mdTemp.digest();            int j = md.length;            char str[] = new char[j * 2];            int k = 0;            for (int i = 0; i < j; i++) {                byte byte0 = md[i];                str[k++] = hexDigits[byte0 >>> 4 & 0xf];                str[k++] = hexDigits[byte0 & 0xf];            }            return new String(str);        } catch (Exception e) {            return null;        }    }    /**     生成签名     */    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(ParameterConfig.WX_API_KEY);        String packageSign = getMessageDigest(sb.toString().getBytes()).toUpperCase();        Log.e("orion",packageSign);        return packageSign;    }    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();    }}

微信回调的Activity

package com.gan.mypay.wxapi;import com.gan.mypay.ParameterConfig;import com.gan.mypay.R;import com.gan.mypay.SelectPayTypeActivity;import com.tencent.mm.sdk.constants.ConstantsAPI;import com.tencent.mm.sdk.modelbase.BaseReq;import com.tencent.mm.sdk.modelbase.BaseResp;import com.tencent.mm.sdk.openapi.IWXAPI;import com.tencent.mm.sdk.openapi.IWXAPIEventHandler;import com.tencent.mm.sdk.openapi.WXAPIFactory;import android.app.Activity;import android.app.AlertDialog;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.widget.Toast;public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{    private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";    private IWXAPI api;   // private TextView reulttv;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.wx_pay_result);        api = WXAPIFactory.createWXAPI(this, ParameterConfig.WX_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) {        Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);        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();            Intent intent;            int code = resp.errCode;            switch (code) {            case 0:                Toast.makeText(this, "支付成功",0).show();                intent=new Intent(this,SelectPayTypeActivity.class);                intent.putExtra("result", 0);                startActivity(intent);                finish();                break;            case -1:                Toast.makeText(this, "支付失败",0).show();                intent=new Intent(this,SelectPayTypeActivity.class);                intent.putExtra("result", -1);                startActivity(intent);                finish();                break;            case -2:                Toast.makeText(this, "支付取消",0).show();                intent=new Intent(this,SelectPayTypeActivity.class);                intent.putExtra("result", -2);                startActivity(intent);                finish();                break;            default:                break;            }        }    }}

已上就是所有微信支付的全部内容,如果看完有什么好的建议和意见,欢迎留言。
本文参考:http://www.2cto.com/kf/201605/508631.html

0 0