微信支付
2016-05-24 17:26
429 查看
微信支付的调用是比较简单的,总体来说是这样的:
在微信官网上申请权限:主要是三个参数:
前两个是微信给我们的参数。第三个是API_KEY在微信的商户平台上自己设定的。
有了这三个参数后台就可以为我们申请数据给我们返回7个参数了:
这七个参数的prepayid是必须后台给我们的其他的可以在app上自己生成,具体的生成过程看官网的带帽。
我再、在座的时候sign是后台返回的发现,支付不成功,我自己在app上又生成了一次,结果成功了,不知为何。
讲这七个参数加到req上就可以发起请求了。
支付结束后会回调一个activity: WXPayEntryActivity,注意这个activity的包名必须为,系统包名.wxapi这是必须的。
下面是一个带帽的主函数:
这是官方的带帽,所用参数都是在本地生成的。
在微信官网上申请权限:主要是三个参数:
//appid 微信分配的公众账号ID public static final String APP_ID =""; //商户号 微信分配的公众账号ID public static final String MCH_ID =""; // API密钥,在商户平台设置 public static final String API_KEY= "";
前两个是微信给我们的参数。第三个是API_KEY在微信的商户平台上自己设定的。
有了这三个参数后台就可以为我们申请数据给我们返回7个参数了:
这七个参数的prepayid是必须后台给我们的其他的可以在app上自己生成,具体的生成过程看官网的带帽。
我再、在座的时候sign是后台返回的发现,支付不成功,我自己在app上又生成了一次,结果成功了,不知为何。
讲这七个参数加到req上就可以发起请求了。
支付结束后会回调一个activity: WXPayEntryActivity,注意这个activity的包名必须为,系统包名.wxapi这是必须的。
下面是一个带帽的主函数:
package net.sourceforge.simcpux; import java.io.StringReader; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Random; import com.chinat2t21829ys.templt.R; import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair; import org.xmlpull.v1.XmlPullParser; import android.app.Activity; import android.app.ProgressDialog; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.util.Xml; import android.view.View; import android.widget.Button; import android.widget.TextView; import com.tencent.mm.sdk.modelpay.PayReq; import com.tencent.mm.sdk.openapi.IWXAPI; import com.tencent.mm.sdk.openapi.WXAPIFactory; 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(); //生成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 appay_pre_btn = (Button) findViewById(R.id.appay_pre_btn); appay_pre_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { genPayReq(); } }); // 调起微信支付 Button appayBtn = (Button) findViewById(R.id.appay_btn); appayBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sendPayReq(); } }); } /** 生成签名 */ 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('&'); //ni shuo w rong yi ma shangbeizi qian nid } 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 "COATBAE810"; //订单号写死的话只能支付一次,第二次不能生成订单 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://121.40.35.3/test")); 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", "2000000")); packageParams.add(new BasicNameValuePair("trade_type", "APP")); String sign = genPackageSign(packageParams); packageParams.add(new BasicNameValuePair("sign", sign)); String xmlstring =toXml(packageParams); return xmlstring; } 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.packageValue = "WXPay"; 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); } }
这是官方的带帽,所用参数都是在本地生成的。
相关文章推荐
- Java小程序:输入两个正整数m和n,利用辗除法求其最大公约数
- 微信推送消息 errcode 45047,errmsg :out of response count limit hint
- 一款自动汇报工作的微信机器人
- 小程序总结
- 微信移动支付接口申请——2016年5月版
- 微信登录授权错误整理
- 微信开发,公众号支付及微信扫描支付各自使用的密码分别来自哪里
- 个人微信公众号
- Android微信智能心跳方案
- Java小程序:输入一组复数并打印出来
- python爬虫抓手机号+java客户端小程序3
- 第七讲 分支结构程序体验之练习 3个小程序
- 今天早上开了微信,确实是太卡了
- iOS 微信支付 实用教程
- IOS开发--微信支付
- java-微信新版自动聊天助手
- 微信公众平台百度天气预报开发
- zabbix微信报警之企业号
- 逻辑思维题 微信18954274246 答案
- Android高仿微信图片选择上传工具