Android中如何集成微信支付,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
注释: 要继承微信支付和支付宝功能,必须要有以下配置信息,微信支付和支付宝支付申请的秘钥等提供给开发者(当然也可以自己去申请),将配置信息放在静态类中,已被统一使用(安全考虑,微信支付宝推荐这些数据放在服务其中)
public class ParameterConfig {
public static final String GANHOST = "http://101.226.197.11"; //服务器地址ip(根据自己替换)
/**
* 微信
*/
<span > </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;
}
}
}
}
关于Android中如何集成微信支付问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/huangxianfeng/blog/799928