文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android中怎么实现微信支付功能

2023-05-31 00:18

关注

Android中怎么实现微信支付功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

去微信开放平台申请微信支付服务,绑定自己的应用这里具体不多讲,但是一定要申请完成,将会得到是三个参数

//appid 微信分配的公众账号IDpublic static final String APP_ID = "";//商户号 微信分配的公众账号IDpublic static final String MCH_ID = "";// API密钥,在商户平台设置public static final String API_KEY= "";

**坑点提示:在微信开发平台设置包名和签名。这里的包名一定要和你自己的包名一样,就是manifest中的package,签名一定要和你用官方app生成的一样(https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk)。

微信会根据你的填写的包名,然后对你的keystore进行一种算法,生成你的签名。包名和签名一定要和微信开放平台的相同。不过这里需要注意的是,如果你发布的正式版本,需要用官方app重新生成签名,然后在开放平台重新设置sign,因为测试版本的keystore与正式版的keystore不一样。总之,就是你用的keystore生成的sign要和微信开放平台的时刻保持一致。**

准备工作做好了,接下来就是开发了,先下载微信的jar包,导入。

微信支付分为三个步骤

① .生成prepayId

@Overrideprotected Map<String, String> doInBackground(String... params) {      // TODO Auto-generated method stub      String url=String.format(params[0]);      String entity=getProductArgs();      Log.e("Simon",">>>>"+entity);      byte[] buf=Util.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 = Constants.APP_ID;    req.partnerId = Constants.MCH_ID;    if (resultunifiedorder!=null) {      req.prepayId = resultunifiedorder.get("prepay_id");      req.packageValue = "prepay_id="+resultunifiedorder.get("prepay_id");    }    else {      Toast.makeText(MainActivity.this, "prepayid为空", Toast.LENGTH_SHORT).show();    }    req.nonceStr = getNonceStr();    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");    textView.setText(sb.toString());    Log.e("Simon", "----"+signParams.toString());}

③ .调起支付

private void sendPayReq() {    msgApi.registerApp(Constants.APP_ID);    msgApi.sendReq(req);    Log.i(">>>>>", req.partnerId);}

下面给出完整代码 

package com.alpha.live;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 org.apache.http.NameValuePair;import org.apache.http.message.BasicNameValuePair;import org.xmlpull.v1.XmlPullParser;import com.tencent.mm.sdk.modelpay.PayReq;import com.tencent.mm.sdk.openapi.IWXAPI;import com.tencent.mm.sdk.openapi.WXAPIFactory;import android.app.Activity;import android.app.AlertDialog;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.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity implements OnClickListener {  private Button submitButton;  private Button confirmButton;  private TextView textView;  private StringBuffer sb;  private Map<String,String> resultunifiedorder;  private PayReq req;  private final IWXAPI msgApi = WXAPIFactory.createWXAPI(this, null);  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    submitButton=(Button) findViewById(R.id.bt_submit_order);    confirmButton=(Button) findViewById(R.id.bt_corfirm);    textView=(TextView) findViewById(R.id.tv_prepay_id);    submitButton.setOnClickListener(this);    confirmButton.setOnClickListener(this);    sb=new StringBuffer();    req=new PayReq();  }  @Override  public void onClick(View v) {    // TODO Auto-generated method stub    switch (v.getId()) {    case R.id.bt_submit_order:      String urlString="https://api.mch.weixin.qq.com/pay/unifiedorder";       PrePayIdAsyncTask prePayIdAsyncTask=new PrePayIdAsyncTask();       prePayIdAsyncTask.execute(urlString);   //生成prepayId    break;    case R.id.bt_corfirm:      genPayReq();//生成签名参数      sendPayReq();//调起支付    break;    default:      break;    }  }    private void sendPayReq() {    msgApi.registerApp(Constants.APP_ID);    msgApi.sendReq(req);    Log.i(">>>>>", req.partnerId);  }  private long genTimeStamp() {    return System.currentTimeMillis() / 1000;  }  private void genPayReq() {    req.appId = Constants.APP_ID;    req.partnerId = Constants.MCH_ID;    if (resultunifiedorder!=null) {      req.prepayId = resultunifiedorder.get("prepay_id");      req.packageValue = "prepay_id="+resultunifiedorder.get("prepay_id");    }    else {      Toast.makeText(MainActivity.this, "prepayid为空", Toast.LENGTH_SHORT).show();    }    req.nonceStr = getNonceStr();    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");    textView.setText(sb.toString());    Log.e("Simon", "----"+signParams.toString());  }  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("Simon","----"+appSign);    return appSign;  }  private class PrePayIdAsyncTask extends AsyncTask<String,Void, Map<String, String>>  {    private ProgressDialog dialog;    @Override    protected void onPreExecute() {      // TODO Auto-generated method stub      super.onPreExecute();      dialog = ProgressDialog.show(MainActivity.this, "提示", "正在提交订单");    }    @Override    protected Map<String, String> doInBackground(String... params) {      // TODO Auto-generated method stub      String url=String.format(params[0]);      String entity=getProductArgs();      Log.e("Simon",">>>>"+entity);      byte[] buf=Util.httpPost(url, entity);      String content = new String(buf);      Log.e("orion", "----"+content);      Map<String,String> xml=decodeXml(content);      return xml;    }    @Override    protected void onPostExecute(Map<String, String> result) {      // TODO Auto-generated method stub      super.onPostExecute(result);      if (dialog != null) {        dialog.dismiss();      }      sb.append("prepay_id\n"+result.get("prepay_id")+"\n\n");      textView.setText(sb.toString());      resultunifiedorder=result;    }  }  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("Simon","----"+e.toString());    }    return null;  }  private String getProductArgs() {    // TODO Auto-generated method stub    StringBuffer xml=new StringBuffer();    try {      String nonceStr=getNonceStr();      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", "https://www.baidu.com"));//写你们的回调地址      packageParams.add(new BasicNameValuePair("out_trade_no",genOutTradNo()));      packageParams.add(new BasicNameValuePair("total_fee", "1"));      packageParams.add(new BasicNameValuePair("trade_type", "APP"));      String sign=getPackageSign(packageParams);      packageParams.add(new BasicNameValuePair("sign", sign));      String xmlString=toXml(packageParams);      return xmlString;    } catch (Exception e) {      // TODO: handle exception      return null;    }  }  //生成订单号,测试用,在客户端生成  private String genOutTradNo() {    Random random = new Random();//   return "dasgfsdg1234"; //订单号写死的话只能支付一次,第二次不能生成订单    return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());  }  //生成随机号,防重发  private String getNonceStr() {    // TODO Auto-generated method stub    Random random=new Random();    return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());  }    private String getPackageSign(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("Simon",">>>>"+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("Simon",">>>>"+sb.toString());    return sb.toString();  }}

看完上述内容,你们掌握Android中怎么实现微信支付功能的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网行业资讯频道,感谢各位的阅读!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯