微信支付

来源:互联网 发布:淘宝产品恶意投诉假货 编辑:程序博客网 时间:2024/06/06 00:23

holle大家好,我是小希,今天第一次写博客,写博客的原因是为了记录一些技术知识,方便以后遇到问题查看。

相信大家在集成微信支付的时候遇到过很多坑,为了方便大家不再走弯路,现在我把相关代码分享给大家,代码可以直接用,只要改一改相关配置文件即可。

ok,废话不多说,直接上代码。


 public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {

    private IWXAPI api;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout);
        api = WXAPIFactory.createWXAPI(this, Constants.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) {
        System.out.println("支付结果===" + resp.errCode + "----sss--" + resp.errStr);
//        String id = SharedPreferencesUtil.readDingDan(getApplicationContext());
        if (resp.errCode == 0) {
        //成功
        } else {
        }
    }



//支付activity需要的
// ------------------------------微信-----------------------------
private String APP_MCHID = "1272267501"; // 商户id
private String APP_KEY = "byt34888byt34888byt34888byt34888";
private IWXAPI msgApi;
private PayReq req;
StringBuffer sb;
Map<String, String> resultunifiedorder;
// ------------------------------微信----------------------------- 



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

// private ProgressDialog dialog;

@Override
protected void onPreExecute() {
System.out.println("正在生成与支付订单");
dialog.show();
}

@Override
protected void onPostExecute(Map<String, String> result) {
// if (dialog != null) {
// dialog.dismiss();
// }
sb.append("prepay_id\n" + result.get("prepay_id") + "\n\n");
System.out.println("prepay_id:---------------------"
+ sb.toString());
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 = 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 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(APP_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(APP_KEY);

this.sb.append("sign str\n" + sb.toString() + "\n\n");
String appSign = MD5.getMessageDigest(sb.toString().getBytes())
.toUpperCase();
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 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.WX_APP_ID));
packageParams.add(new BasicNameValuePair("body", "weixin"));// 商品名字
packageParams.add(new BasicNameValuePair("mch_id", APP_MCHID));
packageParams.add(new BasicNameValuePair("nonce_str", genNonceStr()));
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"));
DecimalFormat df2 = new DecimalFormat("0");
packageParams.add(new BasicNameValuePair("total_fee", df2
.format(pay_price * 100))); // 商品单价 不能有小数点

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

return xmlstring;

} catch (Exception e) {
Log.e("s", "genProductArgs fail, ex = " + e.getMessage());
return null;
}

}

// *******************************************************
private void genPayReq() {

req.appId = Constants.WX_APP_ID;
req.partnerId = APP_MCHID;
req.prepayId = resultunifiedorder.get("prepay_id");
req.packageValue = "Sign=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");
System.out.println("最后结果:-------------------------" + sb.toString());
dialog.cancel();
msgApi.sendReq(req);
Log.e("orion", signParams.toString());

}



清单文件需要的


<!-- 微信支付 -->
        <activity
            android:name="com.pvgo.ivs.activity.wxapi.WXPayEntryActivity"
            android:exported="true"
            android:launchMode="singleInstance" />

        <receiver
            android:name="com.pvgo.ivs.Utils.AppRegister"
            tools:ignore="InnerclassSeparator,ExportedReceiver" >
            <intent-filter>
                <action android:name="com.tencent.mm.plugin.openapi.Intent.ACTION_REFRESH_WXAPP" />
            </intent-filter>
        </receiver>



微信的广播

public class AppRegister extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
final IWXAPI api = WXAPIFactory.createWXAPI(context, null);

api.registerApp(Constants.WX_APP_ID);
}
}


以上这些是主要代码,其他的没啥说的,大家都会。
还有一些需要注意的是要吊起微信支付,你的keystore文件一定要配置到你的开发工具中,不然是没办法吊起来的。

0 0
原创粉丝点击